283. 移动零
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
说明:
- 必须在原数组上操作,不能拷贝额外的数组。
- 尽量减少操作次数。
代码:
class Solution:
def moveZeroes(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
#### the first method, 不符合题目的返回值要求,所以不能算数。
# count = 0
# for i in nums:
# if i == 0:
# count += 1
# nums.remove(i)
# nums = nums + [0] * count
# return nums
#### the second method
# count = 0
# for i in range(len(nums)):
# if nums[i] != 0:
# nums[count] = nums[i]
# count += 1
# nums[count:] = (len(nums)- count) * [0]
#### the third method:
# length = len(nums)
# for i in range(length):
# if nums[i]== 0:
# nums.remove(nums[i])
# nums.append(0)
#### the third method
length = len(nums)
k = 0
for i in range(length):
if nums[i-k] == 0:
del nums[i-k]
nums.append(0)
k += 1
1. 两数之和
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。
你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。
示例:
给定 nums = [2, 7, 11, 15], target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]
代码:
class Solution2(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
# left = 0
# right = 0
# nums_copy = nums.copy()
# nums.sort()
# for i in range(0, len(nums) -1):
# if nums[i] + nums[i+1] >= target:
# left = i
# right = i + 1
# break
# # print(left)
# # print(right)
# while left >= 0 and right < len(nums):
# if nums[left] + nums[right] > target:
# left -= 1
# elif nums[left] + nums[right] < target:
# right += 1
# else:
# if nums[left] == nums[right]:
# return [nums_copy.index(nums[left]), nums_copy.index(nums[right], left+1)]
# else:
# return [nums_copy.index(nums[left]), nums_copy.index(nums[right])]
#### the second method
class Solution8:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
n = len(nums)
hash = {}
for i in range(n):
complement = target - nums[i]
if hash.__contains__(complement):
return [hash[complement], i]
hash[nums[i]] = i
raise Exception("No match pair")