按照力扣官网上的题目顺序,先慢慢写吧:
1.两数之和 给定一个整数数组nums 和一个目标值target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。PS:你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
思路:用target减去nums中的每一个数,并设立一个字典来记录对应的下标
class Solution:
def twoSum(self, nums, target):
#空字典用于存储数值下标
#结果只有一个,所以不用额外考虑
#由于加法/减法的对称性,所以顺序不是特别重要
d = {}
for index, num in enumerate(nums):
another_num = target - num
if another_num in d:
# 如果等式成立,就返回被减数的下标和减数的下标
return [d[another_num],index]
# 更新下标
d[num] = index
return None
注意:检查某个Key在不在字典中有两种方法, xxx in dict 或者 dict.get(xxx) is not None
2.无重复最长字符串 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
思路:1.固定左边界;2.记录下标和内容;3.如何统计字符串长度;4.在碰到重复字符串时怎么办
res = 0
left = 0
char2index = {}
### 1、设置一个左边界
### 2、记录字符出现的位置
### 3、什么条件下需要计算长度
### 4、遇到重复字符怎么更新位置,要更新到重复元素的下一位;如果下一个刚好也是同样的元素,就会快速更新
for index,char in enumerate(s):
if (char not in char2index) or (char2index[char] < left):
char2index[char] = index
res = max(res, index - left + 1)
else:
#遇到重复的字符串,首先把左边界挪一位
#然后更新该字符的位置
left = char2index[char] + 1
char2index[char] = index
扩展:给一个数字,怎么按照从高到低的位数返回一个列表,比如num=32145,返回的是['3','2','1','4','5'],涉及到数字和字符串的转变
3.技巧
字符串逆输出 "12345" --> "54321" 用 str[::-1]即可
字典内部查找键,用dict.get("目标键",目标键不在时的返回值)