剑指 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 方法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. 无重复字符的最长子串

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

"""

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. 反转字符串中的单词

1
2
s = "  hello world  "
print(" ".join(sorted(s.strip().split(" "),reverse=True)))

__END__