例题:现有列表nums=[2, 7, 11, 15],target=9。
要求:在列表中找出两个数字,使得两个数字和为target(target=9),返回它们索引。
此题是:因为2+7=9,所以返回2,7的索引为0,1。
LeetCode的编码行为:
class Solution:
def twoSum(self, nums, target):
""":type nums: List[int]:type target: int:rtype: List[int]"""
我的最初的代码是(在编辑器里运行):
class Solution:
def twoSum(self, nums, target):
""":type nums: List[int]:type target: int:rtype: List[int]"""
nums_1= nums
while (len(nums_1) != 0):
second_num = target - nums_1[0]
first_num = nums_1[0]
del nums_1[0]
if second_num in nums_1:
return [nums.index(first_num), nums.index(second_num)]
aaa = Solution()
print(aaa.twoSum([2, 7, 11, 15], 9))
报错为:ValueError: 2 is not in list
显然,虽然我重新定义了一个变量:nums_1,但是当我删去nums_1中的元素2时,原列表nums也跟着删去了2,所以报错2不在nums中。但是,我明明对nums没有使用删去命令。这样只能说明了,nums_1和nums之间存在指针关系。
我想问的是这是什么样的指针关系?一个变,另一个也跟着变。
但是,如果是最简单的代码:
a = 0
b = a
a += 100
print(a)
print(b)
显然输出结果为: a=1000,b=0。
那么,为什么这里a和b之间不存在指针关系啊(a和b如果存在指针的话,就一起发生变化了。)?和上面那个错误不一样吗?
以前,在用pandas也遇到过这种问题,我都是避开,这道题避开指针的方法,也是正确的方法为(也就是先赋予个变量):
class Solution:
def twoSum(self, nums, target):
""":type nums: List[int]:type target: int:rtype: List[int]"""
nums_1 = []
nums_1[:] = nums
while (len(nums_1) != 0):
second_num = target - nums_1[0]
first_num = nums_1[0]
del nums_1[0]
if second_num in nums_1:
return [nums.index(first_num), nums.index(second_num)]
aaa = Solution()
print(aaa.twoSum([2, 7, 11, 15], 9))
后来,这个方法不完全正确,比如分不开[3, 3]的情况。
正确的为:
class Solution:
def twoSum(self, nums, target):
""":type nums: List[int]:type target: int:rtype: List[int]"""
i = -1
while (len(nums) != 0):
second_num = target - nums[0]
del nums[0]
i += 1
if second_num in nums:
return [i, nums.index(second_num)+i+1]
当然哈,这种解法不一定是最优解,只希望同学们帮我看看我的问题,小白请教了。