群里有人发起一起刷 LeetCode, 那我也来刷刷题,看能刷几道。第一道都不简单啊,对于我来说。
two sum
看了一眼觉得很简单,双向同时开始查,不就好了么。然而……
1
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in nums:
for j in nums[::-1]:
if i+j == target:
return [nums.index(i),nums.index(j)]
nums = [2, 7, 11, 15]
target = 9
print(Solution().twoSum(nums,target))
- 反向列表 [::-1], 步长-1
- list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
error:
Input:
[3,2,4]
6
Output:
[0,0]
Expected:
[1,2]
输出[0,0],预期应该是[1,2],内层循环到头了,取到第一个3。所以应该循环到外层键的左侧。
2
for r,i in zip(range(len(nums)),nums):
for j in nums[:r:-1]:
if i+j == target:
return [nums.index(i),nums.index(j)]
由于我不知道怎么能循环值的时候循环出索引0,1,2之类的,所以用了range zip生成。
error:
Input:
[3,3]
6
Output:
[0,0]
Expected:
[0,1]
因为我用index()取位置的缘故。好好的取索引吧!
3
for k,v in enumerate(nums):
for k2,v2 in enumerate(nums):
if k2<=k:
continue
if v+v2 == target:
return [k,k2]
英文版的AC了,但是中文的有超时
[0,2,4,6,...,25194,25196]
16021
注:这个列表太大,60k,我放到文件里
测试数据
放本地跑是可以出结果的
[8010, 8011]
再想一想,优化一下,自己菜的抠脚不能小瞧每一道题啊,记得别的OJ平台第一个都是hello world级别,两数相加。
4
for k,v in enumerate(nums):
other_num = target-v
if other_num in nums:
t_k = nums.index(other_num)
if k!=t_k:
return [k,t_k]
这次用的思路是,看另外一个值在不在列表里,在的话找索引与当前索引比对,相同就继续找,不同就找出来了。 bingo!
总结: Python 刚学,好多语法糖都不会用。算法也没有研究。感觉不到10题我就会举白旗。