剑指 Offer 62. 圆圈中最后剩下的数字
0 1 2 3 4 5 6
0 1 2 4 5 6 第1次 删除3
0 1 2 5 6 第2次 删除4
0 1 2 6 第3次 删除5
0 1 2 第4次 删除6
… 第n次
# 方法1: 递归
def lastRemaining(n, m):
# 递归方法,最后剩下的数字的编号
if n == 1:
return 0
return (lastRemaining(n - 1, m) + m) % n
# 方法2: 动态规划
def lastRemaining(n, m):
last = 0 # 当只剩下一个数字时,最后的数字是0
for i in range(2, n + 1): # 从2开始,因为我们已经知道当n=1时,结果是0
last = (last + m) % i
return last
0003. 无重复字符的最长子串
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
left = 0
right = 0
window = dict()
ans = 0
while right < len(s):
if s[right] not in window:
window[s[right]] = 1
else:
window[s[right]] += 1
while window[s[right]] > 1:
window[s[left]] -= 1
left += 1
ans = max(ans, right - left + 1)
right += 1
return ans
0014. 最长公共前缀
"""
1、依次遍历所有字符串的每一列,比较相同位置上的字符是否相同。
如果相同,则继续对下一列进行比较。
如果不相同,则当前列字母不再属于公共前缀,直接返回当前列之前的部分。
2、如果遍历结束,说明字符串数组中的所有字符串都相等,则可将字符串数组中的第一个字符串作为公共前缀进行返回。
"""
strs = ["flower", "flow", "flight"]
length = len(strs[0])
count = len(strs)
for i in range(length):
c = strs[0][i]
for j in range(1, count):
if len(strs[j]) == i or strs[j][i] != c:
result = strs[0][:i]
result = strs[0]
0151. 反转字符串中的单词
s = " hello world "
print(" ".join(sorted(s.strip().split(" "),reverse=True)))
__END__