题目:
给定一个整数数组
nums
和一个整数目标值target
,请你在该数组中找出 和为目标值target
的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例:
示例 1:
输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:
输入:nums = [3,2,4], target = 6 输出:[1,2]示例 3:
输入:nums = [3,3], target = 6 输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
解答:
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
num_dict = {}
for i,num in enumerate(nums):
complement = target - num
if complement in num_dict:
return [num_dict[complement],i]
num_dict[num] = i
思路:
使用字典储存已经判断的数据,每次循环再在字典里面查找是否存在需要的差数,若存在,则返回循环的索引以及对应差值索引(这里对应差值在字典中的索引);若不存在,则将该次循环的值储存在字典中,以供下一次循环使用
学习到的内容:
1. enumerate()
将一个迭代对象转化成(一个包含序列和值的)枚举对象
基本语法
enumerate(iterable, start=0)
iterable
:这是一个必需参数,代表要进行枚举的可迭代对象,例如列表、元组、字符串、集合、字典的键或值等。start
:这是一个可选参数,指定索引的起始值,默认值为 0。
返回值
enumerate()
函数返回一个枚举对象,该对象是一个迭代器,每次迭代会返回一个包含索引和对应元素的元组。
代码示例
# 示例列表
fruits = ['apple', 'banana', 'cherry']
# 不指定起始索引,默认从 0 开始
for index, fruit in enumerate(fruits):
print(f"索引 {index} 对应的水果是: {fruit}")
print("\n")
# 指定起始索引为 1
for index, fruit in enumerate(fruits, start=1):
print(f"索引 {index} 对应的水果是: {fruit}")
在上述代码中,第一个 for
循环使用 enumerate(fruits)
进行迭代,索引默认从 0 开始;第二个 for
循环使用 enumerate(fruits, start=1)
进行迭代,索引从 1 开始。
适用场景
1. 遍历列表并需要同时获取索引和元素
当你需要遍历一个列表,并且在处理元素的同时还需要知道元素的索引时,enumerate()
函数就非常有用。例如,在更新列表中特定位置的元素时:
numbers = [10, 20, 30, 40, 50]
for index, num in enumerate(numbers):
if num % 20 == 0:
numbers[index] = num * 2
print(numbers)
在这个例子中,我们遍历 numbers
列表,当元素能被 20 整除时,将该元素的值乘以 2 并更新到原列表中。
2. 生成包含索引的字典
如果你想将一个列表转换为一个字典,其中键是元素的索引,值是元素本身,可以使用 enumerate()
函数:
colors = ['red', 'green', 'blue']
color_dict = {index: color for index, color in enumerate(colors)}
print(color_dict)
这里使用字典推导式结合 enumerate()
函数,将 colors
列表转换为一个字典,字典的键是颜色的索引,值是颜色名称。
3. 在循环中需要根据索引进行条件判断
有时候,你可能需要根据元素的索引来决定是否执行某些操作。例如,只处理列表中偶数索引位置的元素:
words = ['hello', 'world', 'python', 'programming']
for index, word in enumerate(words):
if index % 2 == 0:
print(f"处理偶数索引位置的单词: {word}")
在这个例子中,我们只处理 words
列表中偶数索引位置的单词。
4. 记录数据的位置信息
在处理数据时,可能需要记录每个数据在原始数据中的位置。例如,在分析文本时,记录每个单词在句子中的位置:
sentence = "Python is a powerful programming language"
words = sentence.split()
for index, word in enumerate(words):
print(f"单词 '{word}' 在句子中的位置是 {index + 1}")
这里将句子拆分为单词列表,然后使用 enumerate()
函数记录每个单词在句子中的位置。
本题中出现了值和索引的绑定,因此选择使用这个函数
2. if … in …
in 是一个成员运算符,用来判断某个值是否为另一个可迭代对象的成员
可适用于:列表、字符串、集合、字典(注意,字典对应匹配的是键)
基本语法
if value in iterable:
# 如果 value 在 iterable 中,执行这里的代码块
pass
else:
# 如果 value 不在 iterable 中,执行这里的代码块
pass
value
:代表要检查的值。iterable
:表示可迭代对象,像列表、元组、字符串、字典、集合等都属于可迭代对象。
工作原理
in
运算符会对value
是否存在于iterable
里进行检查。若存在,if
语句的条件为True
,会执行if
代码块;若不存在,条件为False
,会执行else
代码块(如果有else
语句的话)。
不同可迭代对象下的使用示例
1. 列表
numbers = [1, 2, 3, 4, 5]
if 3 in numbers:
print("3 在列表 numbers 中")
else:
print("3 不在列表 numbers 中")
在这个例子中,in
运算符会检查数字 3
是否存在于列表 numbers
里。由于 3
是列表的成员,所以会输出 3 在列表 numbers 中
。
2. 字符串
text = "Hello, World!"
if "World" in text:
print("'World' 在字符串 text 中")
else:
print("'World' 不在字符串 text 中")
这里,in
运算符会检查子字符串 "World"
是否存在于字符串 text
中。因为 "World"
是 text
的一部分,所以会输出 'World' 在字符串 text 中
。
3. 字典
在字典里,in
运算符默认检查的是键,而非值。
person = {"name": "Alice", "age": 25}
if "name" in person:
print("键 'name' 在字典 person 中")
else:
print("键 'name' 不在字典 person 中")
此例中,in
运算符检查 "name"
是否为字典 person
的键。由于 "name"
是字典的一个键,所以会输出 键 'name' 在字典 person 中
。
4. 集合
fruits = {"apple", "banana", "cherry"}
if "banana" in fruits:
print("'banana' 在集合 fruits 中")
else:
print("'banana' 不在集合 fruits 中")
在这个例子中,in
运算符检查 "banana"
是否为集合 fruits
的成员。因为 "banana"
存在于集合中,所以会输出 'banana' 在集合 fruits 中
。
3. 字典
顾名思义,字典是由“键”-“值”对构成的数据集合(也是可迭代对象),通过键来记录对象信息
字典的概念
在 Python 中,字典(
dict
)是一种无序、可变且可哈希的数据类型,用于存储键值对(key – value pairs)。每个键(key)在字典中是唯一的,它与一个值(value)相关联。字典就像一个映射表,通过键可以快速查找对应的值,类似于现实生活中的字典,通过单词(键)可以找到其释义(值)。字典的声明
1. 使用花括号
{}
可以使用花括号来创建一个空字典,或者在花括号中直接指定键值对来初始化字典。键和值之间用冒号
:
分隔,键值对之间用逗号,
分隔。# 创建一个空字典 empty_dict = {} # 创建一个包含键值对的字典 student = { "name": "Alice", "age": 20, "major": "Computer Science" }
2. 使用
dict()
构造函数
dict()
构造函数可以通过多种方式创建字典。# 通过关键字参数创建字典 person = dict(name="Bob", age=25, city="New York") # 通过可迭代对象创建字典,可迭代对象中的每个元素必须是包含两个元素的可迭代对象(如元组) employee = dict([("id", 101), ("department", "HR")])
字典的使用
1. 访问字典中的值
可以通过键来访问字典中对应的值。如果键不存在,会引发
KeyError
异常。为了避免这种情况,可以使用get()
方法,当键不存在时,get()
方法会返回None
或指定的默认值。student = { "name": "Alice", "age": 20, "major": "Computer Science" } # 通过键访问值 print(student["name"]) # 输出: Alice # 使用 get() 方法访问值 print(student.get("age")) # 输出: 20 print(student.get("grade", "N/A")) # 键 "grade" 不存在,返回默认值 "N/A"
2. 修改和添加键值对
字典是可变的,可以通过键来修改已有的值,或者添加新的键值对。
student = { "name": "Alice", "age": 20, "major": "Computer Science" } # 修改已有的键值对 student["age"] = 21 print(student) # 输出: {'name': 'Alice', 'age': 21, 'major': 'Computer Science'} # 添加新的键值对 student["grade"] = "A" print(student) # 输出: {'name': 'Alice', 'age': 21, 'major': 'Computer Science', 'grade': 'A'}
3. 删除键值对
可以使用
del
语句或pop()
方法来删除字典中的键值对。student = { "name": "Alice", "age": 20, "major": "Computer Science" } # 使用 del 语句删除键值对 del student["age"] print(student) # 输出: {'name': 'Alice', 'major': 'Computer Science'} # 使用 pop() 方法删除键值对,并返回被删除的值 major = student.pop("major") print(major) # 输出: Computer Science print(student) # 输出: {'name': 'Alice'}
4. 遍历字典
可以使用不同的方式遍历字典,如遍历键、遍历值或同时遍历键和值。
student = { "name": "Alice", "age": 20, "major": "Computer Science" } # 遍历键 for key in student: print(key) # 等价于 for key in student.keys(): print(key) # 遍历值 for value in student.values(): print(value) # 同时遍历键和值 for key, value in student.items(): print(f"{key}: {value}")
5. 检查键是否存在
可以使用
in
运算符来检查一个键是否存在于字典中。student = { "name": "Alice", "age": 20, "major": "Computer Science" } if "name" in student: print("键 'name' 存在于字典中")