Skip to content
Go back

奥克兰腾讯光子工作室群 - 一面 - 面试总结

Published:  at  03:51 PM

Table of contents

Open Table of contents

简历实习&项目深度解析+讨论(30min+)

拷打简历上的实习经历和项目经历内容


算法题目 1. (约瑟夫问题)

n 个小朋友围成一圈,从第一个开始报数,每报到 m 的小朋友就出列(被淘汰),然后从下一个小朋友继续重新从 1 报数,直到只剩下一个人为止。


解题思路

我们要模拟这个过程,不断:

  1. 报数
  2. 淘汰一个人
  3. 从下一个人开始继续

可以使用列表来模拟这些小朋友,每次淘汰一个之后就更新索引,从这个位置继续。


代码实现

def josephus(n, m):
    children = list(range(1, n + 1))  # 小朋友编号:1 到 n
    index = 0  # 从第一个小朋友开始报数(索引为0)

    while len(children) > 1:  # 只要还没只剩一个人
        index = (index + m - 1) % len(children)
        # (index + m - 1): 找到要淘汰的人的位置
        # % len(children): 因为是圆圈,循环回到开头
        children.pop(index)  # 淘汰这个小朋友

    return children[0]  # 剩下的最后一个小朋友

举个例子(n=5, m=3)

初始小朋友:[1, 2, 3, 4, 5]

每次报数到 3 的人出局:

  1. 报数顺序:1→2→3 → 淘汰3 → 剩下:[1, 2, 4, 5]
  2. 从4开始报数:4→5→1 → 淘汰1 → 剩下:[2, 4, 5]
  3. 从2开始:2→4→5 → 淘汰5 → 剩下:[2, 4]
  4. 从2开始:2→4 → 淘汰4 → 剩下:[2]

最后剩下的是编号为 2 的小朋友。


算法题目 2. 字符串空格问题

题目要求:
编写一个程序,对输入字符串进行清洗,满足以下三个要求:

  1. 去除字符串开头和结尾的空格。
  2. 将字符串中间连续多个空格合并成一个空格。
  3. 对于两个中文汉字之间的空格,需要去除(即:“你 好” → “你好”)。

方法一:使用正则表达式

解题思路:

  1. 使用 str.strip() 去除首尾空格。
  2. 使用 re.sub(r'\s+', ' ', s) 合并多个空格为一个。
  3. 使用正则表达式 (?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5]) 匹配中文汉字之间的空格并删除。

正则表达式解释:

代码实现:

import re

def clean_string_regex(s):
    # 去除首尾空格
    s = s.strip()
    # 合并多个空格为一个
    s = re.sub(r'\s+', ' ', s)
    # 删除两个中文之间的空格
    s = re.sub(r'(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])', '', s)
    return s

# 示例
text = "  你好   世界   hello   world  中 国   "
print(clean_string_regex(text))  

这个代码仍有些小问题,导致输出结果为 "你好 世界 hello world 中国" 中的“你好 世界”之间还有一个空格没去掉,说明中文间空格未完全清除。

关键问题在这句的顺序:

# 合并多个空格为一个
s = re.sub(r'\s+', ' ', s)
# 删除两个中文之间的空格
s = re.sub(r'(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])', '', s)

先把多个空格合并成了一个空格,然后再尝试删除中文之间的空格。如果两个中文字符之间原本是多个空格,合并之后只剩下一个空格,此时 (?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5]) 仍然可以匹配。

但如果前后顺序换一下,就可能匹配得更干净,尤其当后续还有清洗行为时,容易避免误删或误保留。

正确方案:

import re

def clean_string(s):
    # 去除首尾空格
    s = s.strip()  
    # 删除两个中文之间的空格
    s = re.sub(r'(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])', '', s)
    # 将多个空格合并为一个
    s = re.sub(r'\s+', ' ', s)
    return s

# 示例
text = "  你好   世界   hello   world  中 国   "
print(clean_string(text))  # 输出:你好世界 hello world 中国

Suggest Changes

Next Post
奥克兰腾讯光子工作室群 - 三面 - 面试总结