目录
正在加载目录...

Tiktok OA 一亩三分地 四题Codesignal简简单单拿下!

Tiktok OA 26 1月份换新题了,还是熟悉的套路,非常简单四个题30min内就AC了,基本都是一次过,都是在codesignal出题 70min4题,不依赖自己公司的题库,而是依赖codesignal平台,题目难度的话前两题是easy,然后一道medium,一道hard,分享一套最近刚做的Tiktok OA真题,在一亩三分地上也有很多参考的题目,可以提前熟悉下。

Tiktok OA

Question 1

要求你实现一个图书馆图书流转追踪器:给定一串按顺序执行的操作,模拟图书库存的变化,并在每次 checkout(借书) 时计算被借出图书的保险价值总和。操作分为三类:acquisition(按类别和价格入库若干本书)、checkout(从指定类别中借出若干本书,若同类书存在不同价格,需优先借出价格最低的书,且保证库存充足)、reclassify(将某一类别中指定数量、指定原价的书升级为更高的新价格)。最终需要返回一个数组,按顺序记录每一次 checkout 操作对应的借出书籍总价值。

思路

  • 按“分类”分别维护一个“价格→数量”的计数表和该分类价格的最小堆。
  • acquisition:把价格 p 的数量加 q,并把 p 压入堆。
  • reclassify:把 q 本从价格 from 转到价格 to(减少 from、增加 to),堆采用懒删除,计数为 0 的价格在取堆顶时再清理。
  • checkout:反复取堆顶的最便宜价格,按需拿书并累计保险金额直到满足请求

代码

from heapq import heappush, heappop
def solution(operations):
    cats = {}  
    ans = []
    for op in operations:
        t, c = op[0], op[1]
        if c not in cats:
            cats[c] = [[], {}]
        hp, cnt = cats[c]
        if t == "acquisition":
            q, p = int(op[2]), int(op[3])
            cnt[p] = cnt.get(p, 0) + q
            heappush(hp, p)
        elif t == "reclassify":
            q, a, b = int(op[2]), int(op[3]), int(op[4])
            cnt[a] = cnt.get(a, 0) - q
            cnt[b] = cnt.get(b, 0) + q
            heappush(hp, b)  
        else:  
            q = int(op[2])
            s = 0
            while q > 0:
                while hp and cnt.get(hp[0], 0) == 0:
                    heappop(hp)          
                p = hp[0]
                take = min(q, cnt[p])
                s += take * p
                cnt[p] -= take
                q -= take
                if cnt[p] == 0:
                    heappop(hp)
            ans.append(s)
    return ans

Question 2

一个虚构星球 Octavia 的时间计算问题:一年被分为与地球相同天数的 12 个季节(月),但时间不是用星期而是用 8 种循环的月相(NewMoon → Crescent → Quarter → Gibbous → Full → Waning → Eclipse → Twilight)来表示。已知1 月 1 日的初始月相、目标日期所在的季节(月)和该月中的第几天,要求你从年初开始累计天数,根据“每天月相顺序前进 1 位、8 天一个完整循环”的规则,计算并返回目标日期对应的月相。

思路

  • 先按顺序列出12个月的天数与8个相位。
  • 用前缀和构造 pref[month],表示从年初到该月 1 日之前累计的天数。
  • 计算目标日期在年内的序号 k = pref[season] + dayCount - 1(从0开始)。
  • 初始相位的下标加上 k 后对 8 取模,即为该日期的相位下标并返回对应名称

代码

from itertools import accumulate
def solution(season, dayCount, initialPhase):
    months = ["January","February","March","April","May","June",
              "July","August","September","October","November","December"]
    days   = [31,28,31,30,31,30,31,31,30,31,30,31]
    phases = ["NewMoon","Crescent","Quarter","Gibbous","Full","Waning","Eclipse","Twilight"]
    pref = dict(zip(months, [0] + list(accumulate(days))[:-1]))
    k = pref[season] + (dayCount - 1)                 
    idx = (phases.index(initialPhase) + k) % 8        
    return phases[idx]

Question 3

这道题给你一个二维整数矩阵 matrix 表示仓库货物网格,以及一串字符串指令 commands,要求你按顺序对矩阵执行对应的变换并返回最终矩阵:指令包含 交换两行(swapRows r1 r2)、交换两列(swapColumns c1 c2)、反转某一行(reverseRow r)、反转某一列(reverseColumn c)、以及 整矩阵顺时针旋转 90°(rotate90Clockwise)。本质是实现这些矩阵操作的模拟器,逐条解析命令并就地更新矩阵即可

思路

  • 逐条解析命令字符串,按首词派发到对应操作。
  • 行/列交换用就地交换;行反转直接 list.reverse();列反转用双指针从上下对换。
  • 旋转 90° 时新建 n×m 矩阵并做坐标映射 b[j][m-1-i] = a[i][j],更新当前矩阵。

代码

def solution(matrix, commands):
    a = [row[:] for row in matrix]  
    for cmd in commands:
        parts = cmd.split()
        op = parts[0].lower()
        if op == "swaprows":
            r1, r2 = int(parts[1]), int(parts[2])
            a[r1], a[r2] = a[r2], a[r1]

        elif op == "swapcolumns":
            c1, c2 = int(parts[1]), int(parts[2])
            for i in range(len(a)):
                a[i][c1], a[i][c2] = a[i][c2], a[i][c1]

        elif op == "reverserow":
            r = int(parts[1])
            a[r].reverse()
        elif op == "reversecolumn":
            c = int(parts[1])
            i, j = 0, len(a) - 1
            while i < j:
                a[i][c], a[j][c] = a[j][c], a[i][c]
                i += 1
                j -= 1
        elif op == "rotate90clockwise":  
            m, n = len(a), len(a[0])
            b = [[0] * m for _ in range(n)]
            for i in range(m):
                for j in range(n):
                    b[j][m - 1 - i] = a[i][j]
            a = b
    return a

Question 4

给你一组照片 travelPhotos,每张照片用一对地标 ID 表示,含义是:这两个地标在旅行路线中是相邻连续被访问的(先后顺序不确定)。已知旅行者把所有地标都恰好访问一次,并且路线中每一对相邻地标都在照片集中出现,要求你根据这些“相邻关系”把整条旅行路线还原成一个地标访问顺序数组;输出可以是正向或反向(例如 [3,5,1,4,2] 或其逆序都算正确)。

思路

  • 把每张照片当作无向边,建图并统计每个地标的度数。
  • 由于整段旅程是一条简单路径,只有两个端点的度数为 1。
  • 从任意端点出发,每次走向当前点里“尚未访问”的邻居即可把整条链串起来。
  • 访问过的点放进 seen,直到收集到全部节点即为答案

代码

from collections import defaultdict
def solution(travelPhotos):
    g = defaultdict(list)
    for a, b in travelPhotos:
        g[a].append(b)
        g[b].append(a)
    s = next(x for x, nbrs in g.items() if len(nbrs) == 1)
    ans, seen = [s], {s}
    while len(ans) < len(g):
        u = ans[-1]
        v = next(w for w in g[u] if w not in seen)
        seen.add(v)
        ans.append(v)
    return ans

我们长期稳定承接各大/科技公司如Amazon、TikTok、Google、Amazon等的OA笔试辅助服务,能够确保服务质量,test case能够全部通过。如有需求,请随时联系我们。

正文完