目录
正在加载目录...

Tiktok oa 一亩三分地 | TikTok OA真题

Tiktok OA 一亩三分地 上基本没有看到最近分享出来的原题。Tiktok OA 目前已经从 HackerRank 迁移到了Codesignal 上,考察形式从之前5选择+2编程,变成了4编程,从Codesignal题库随机抽取4道题目,所以可能不会像之前在一个周期内是完全一样的题目。

最近做了挺多 tiktok oa ,都是在Codesignal出题 70min 4题 不依赖自己公司的题库,而是依赖Codesignal平台,题目难度整体中等,一般4题全部通过能够拿到面试几率大。

Tiktok OA 题一

题目:一组数字碎片 fragments(正整数数组),以及一个目标数字 accessCode
你的任务是:统计有多少种不同的方式,可以从 fragments 中选取两个不同位置的碎片,按顺序拼接后,正好得到 accessCode。其实就是统计有多少个有序的下标对 (i, j)i ≠ j),使得:
str(fragments[i]) + str(fragments[j]) == str(accessCode)

解题思路

  1. accessCode 转成字符串 s,并将所有 fragments 转成字符串后用 Counter 统计每个片段的出现次数。
  2. 枚举每个字符串片段 a,若 sa 开头,则看 b = s[len(a):] 是否在 cnt 中。若存在,则可以用 a + b = s
  3. 统计组合数,若 a != b,组合方式为 ca * cb,否则是 ca * (ca - 1)(从不同位置选两个)

代码

from collections import Counter
def solution(fragments, accessCode):
    s = str(accessCode)
    cnt = Counter(map(str, fragments))
    ans = 0
    for a, ca in cnt.items():
        if len(a) < len(s) and s.startswith(a):
            b = s[len(a):]
            cb = cnt.get(b, 0)
            ans += ca * cb if a != b else ca * (ca - 1)
    return ans

Tiktok OA 题二

Tiktok oa 题二

题目:模拟报纸排版(文本对齐),将给定的多段文字按照指定规则排成一个“报纸页面”,并在页面外层加上边框。这道题是一个模拟规则题目,其实就是“文本换行 + 左右对齐 + 加边框”的字符串模拟题,考察细节处理能力。

解题思路

  1. 逐段遍历,把单词尽量装入当前行;一旦再加就超宽,就把当前行写入并开启新行。
  2. 行内容确定后,用空格补齐到 width 长度;左对齐补尾部,右对齐补开头。
  3. 所有行生成后,在行首尾各加 ,并在最上、最下各加 width+2 个 形成边框。
  4. 只线性遍历一次全部单词,时间复杂度 O(总字符数),空间复杂度 O(width)。

代码

def solution(paragraphs, aligns, width):
    lines = []
    for words, align in zip(paragraphs, aligns):
        buf, length = [], 0
        for w in words:
            if buf and length + 1 + len(w) > width:         
                s = ' '.join(buf)
                pad = ' ' * (width - len(s))
                lines.append(s + pad if align == "LEFT" else pad + s)
                buf, length = [], 0
            length += (len(w) + (1 if buf else 0))
            buf.append(w)
        if buf:                                          
            s = ' '.join(buf)
            pad = ' ' * (width - len(s))
            lines.append(s + pad if align == "LEFT" else pad + s)

    border = '*' * (width + 2)
    return [border] + ['*' + l + '*' for l in lines] + [border]

Tiktok OA 题三

题目:一个整数数组 numbers,数组中的每个数字都具有“魔法性质”。一个数字可以通过“最多交换两位数字(一次交换)”变成另一个数字,那么这两个数字就构成一个 合法的魔法配对,需要统计数组中有多少个不同的下标对 (i, j)i < j),满足 numbers[i] 可以通过最多一次数字交换变成 numbers[j]

解题思路

  1. seen 统计已出现数字次数;当前数先与自身(0 次交换)匹配:ans += seen[x]
  2. 枚举当前数所有不同位的两两交换(至多一次交换),跳过会产生前导零的结果。
  3. used 去重,同一结果只统计一次,然后把 seen 中该结果的出现次数累加到答案。
  4. 处理完后把当前数计入 seen

代码

from collections import Counter
def solution(numbers):
    seen = Counter()
    ans = 0
    for x in numbers:
        s = list(str(x))
        m = len(s)
        ans += seen[x]
        used = set()  
        for i in range(m - 1):
            for j in range(i + 1, m):
                if s[i] == s[j]:
                    continue
                s[i], s[j] = s[j], s[i]
                if s[0] != '0':
                    y = int(''.join(s))
                    if y not in used:
                        ans += seen[y]
                        used.add(y)
                s[i], s[j] = s[j], s[i]  
        seen[x] += 1
    return ans

Tiktok OA 题四

题目:有一个整数数组 inventory,表示仓库中物品的类型编号。仓库会考察数组中的连续区间(子数组),需要统计有多少个连续子数组,包含至少 k 种不同且不重复的物品类型。

解题思路

  1. 外层循环固定子数组起点 i,内层循环枚举终点 j,遍历所有可能的连续子数组。
  2. cnt 字典记录每个元素在当前子数组中的出现次数,uniq 记录当前正好出现一次的元素个数。
  3. 当某个元素第一次出现时 uniq+1,当它第二次出现时 uniq-1,维持当前唯一元素数量。
  4. 如果 uniq >= k,则该子数组符合条件,计数器 ans 加一。

代码

def solution(inventory, k):
    n, ans = len(inventory), 0
    for i in range(n):
        cnt = {}
        uniq = 0
        for j in range(i, n):
            x = inventory[j]
            c = cnt.get(x, 0)
            if c == 0:
                uniq += 1
            elif c == 1:
                uniq -= 1
            cnt[x] = c + 1
            if uniq >= k:
                ans += 1
    return ans

了解更多

TikTok OA 一亩三分地 是地里分享最多的题目,做的最多的没什么难度,最近我们做的也是最多,基本都可以AC,VO面前会也会mock,全程跟进度 ,三大语言都没问题,另外北美各大小厂 OA/VO都没问题,上百场经验打底。

如果你近期也拿到Tiktok的OA,可以与我们联系交流,我们免费提供Tiktok OA 真题参考。

正文完