
2025.3月最新tiktok面经,让我们一起来看下吧~
Tiktok三轮第一轮第二轮都是coding,每轮两道题。BQ是讲一个项目,followup项目中遇到的困难。HM面试简历+coding。简历问的infra,coding是dp。
Code
问题1
在允许最多修改数组的一个元素的条件下,这个数组是否是有序的。
考虑从前往后遍历数组,将遇到不满足有序条件的元素nums[i],即nums[i] < nums[i-1],若i为size-1即最后一个元素,或者数组已经全部有序,直接返回true,否则应考虑nums[i+1]的大小:
- 若nums[i+1] >= nums[i-1],如数组0,1,2,【1】,3… 中 3 > 2,此时i+1及之前的元素满足题意条件,若后面是有序的则返回true;
- 否则,如数组0,1,4,【1】,3…中 3 < 4,则若将nums[i-1]改成nums[i],再从i-2开始遍历数组判断其是否有序的即可。
时间复杂度O(n), 空间复杂度O(1)
思路
- 遍历数组,找到第一个违反非递减顺序的位置
i
(即nums[i]
<nums[i-1]
)。 - 如果i已经遍历到数组的末尾或倒数第二个元素,说明最多只有一个元素违反顺序,可以通过修改这个元素来修复,直接返回
true
。 - 检查是否可以通过修改
nums[i-1]
或nums[i]
来修复数组。 - 从位置
i
开始,继续向后遍历数组,检查是否所有元素都满足非递减顺序。如果发现任何违反顺序的元素,则返回false
。 - 如果整个数组都满足非递减顺序,则返回
true
。
class Solution:
def checkPossibility(self, nums):
i = 0
for i in range(1, len(nums)):
if nums[i] < nums[i-1]:
break
if i >= len(nums) - 1:
return True
if nums[i + 1] >= nums[i - 1]:
i += 1
else:
nums[i - 1] = nums[i]
i = max(0, i-2)
for i in range(i, len(nums) - 1):
if nums[i] > nums[i + 1]:
return False
return True
问题2
找到树中到其他节点的平均距离最小的节点,一个edge距离算1,要求时间复杂度为O(n)。 参考
思路
- 首先,定义一个标志变量
visited
,用来标记是否已经找到目标节点p,初始值为false
。 - 定义一个空栈
stack
,用来存储从根节点到目标节点p的路径上的节点值。 - 定义一个函数
getDisToPar
,接收三个参数:当前节点root
、目标节点p
和用于存储路径的栈stack
。 - 在
getDisToPar
函数中,首先检查当前节点是否为空,如果为空,则直接返回。 - 将当前节点的值添加到栈中。
- 如果当前节点就是目标节点p,并且之前没有访问过(
visited
为false
),则将visited
标记为true
,并返回。 - 如果目标节点p还没有找到,先递归地在左子树中查找。
- 如果左子树中没有找到,再递归地在右子树中查找。
- 如果当前节点的左右子树都没有找到目标节点p,说明当前节点不在目标节点p的路径上,将其从栈中弹出。
- 函数运行结束后,栈中存储的就是从根节点到目标节点p的路径上的节点值。
visited = False
stack = []
def getDisToPar(root, p, stack):
global visited
if root is None:
return
# 将节点添加到栈中
stack.append(root.val)
# 如果找到了
if not visited and root == p:
visited = True
return
# 先找左子树
if not visited:
getDisToPar(root.left, p, stack)
# 左子树没找到再找右子树
if not visited:
getDisToPar(root.right, p, stack)
# 如果还没找到,说明不在这个节点下面,弹出来
if not visited:
stack.pop()
return
经过我们的强力面试辅助,OA代写,候选人通过这些面试题的解析和沟通,面试官不仅了解了候选人的编程能力,也看到了我在解决问题过程中清晰的思路和有效的沟通技巧。这些不仅有助于应对 tiktok的面试,同时也能提升我们解决实际编程问题的能力。祝大家面试顺利!
如果你也需要我们的面试辅助服务,请 立即联系我们。