Table of contents
Open Table of contents
简历实习&项目深度解析+讨论(30min+)
拷打简历上的实习经历和项目经历内容
算法题目 1. (约瑟夫问题)
有 n
个小朋友围成一圈,从第一个开始报数,每报到 m
的小朋友就出列(被淘汰),然后从下一个小朋友继续重新从 1 报数,直到只剩下一个人为止。
解题思路
我们要模拟这个过程,不断:
- 报数
- 淘汰一个人
- 从下一个人开始继续
可以使用列表来模拟这些小朋友,每次淘汰一个之后就更新索引,从这个位置继续。
代码实现
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→2→3 → 淘汰3 → 剩下:[1, 2, 4, 5]
- 从4开始报数:4→5→1 → 淘汰1 → 剩下:[2, 4, 5]
- 从2开始:2→4→5 → 淘汰5 → 剩下:[2, 4]
- 从2开始:2→4 → 淘汰4 → 剩下:[2]
最后剩下的是编号为 2 的小朋友。
算法题目 2. 字符串空格问题
题目要求:
编写一个程序,对输入字符串进行清洗,满足以下三个要求:
- 去除字符串开头和结尾的空格。
- 将字符串中间连续多个空格合并成一个空格。
- 对于两个中文汉字之间的空格,需要去除(即:“你 好” → “你好”)。
方法一:使用正则表达式
解题思路:
- 使用
str.strip()
去除首尾空格。 - 使用
re.sub(r'\s+', ' ', s)
合并多个空格为一个。 - 使用正则表达式
(?<=[\u4e00-\u9fa5])\s+(?=[\u4e00-\u9fa5])
匹配中文汉字之间的空格并删除。
正则表达式解释:
[\u4e00-\u9fa5]
:表示中文汉字。(?<=汉字)\s+(?=汉字)
:匹配两个汉字之间的空格,并将其去掉。
代码实现:
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 中国