一. 數(shù)組
數(shù)組題目經(jīng)常會使用到循環(huán),背以下三種循環(huán)方式:
for idx, x in enumerate(nums): # 正向循環(huán)
print(x)
for idx in range(0, len(nums), 1): # 正向循環(huán)
print(nums[idx])
for idx in range(len(nums)-1, -1, -1): # 反向循環(huán)
print(nums[idx])
26. 刪除有序數(shù)組中的重復(fù)項
題目描述:給你一個有序數(shù)組 nums ,請你 原地 刪除重復(fù)出現(xiàn)的元素,使每個元素 只出現(xiàn)一次 ,返回刪除后數(shù)組的新長度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
輸入:nums = [1,1,2]
輸出:2, nums = [1,2]
def removeDuplicates(self, nums: List[int]) -> int:
if len(nums) == 0: # 邊界條件
return 0
cur = nums[0] # 初始化第0個數(shù)
i_cur = 1
for idx in range(1, len(nums)): # 從第1個數(shù)開始循環(huán)
if nums[idx] != cur: # 找不同的數(shù),填值到數(shù)組的前邊。
nums[i_cur] = nums[idx]
cur = nums[i_cur]
i_cur += 1
return i_cur
66. 加一
題目:加1
輸入:digits = [1,2,3]
輸出:[1,2,4]
def plusOne(self, digits: List[int]) -> List[int]:
n = len(digits)
if digits[n-1] < 9: # 末尾數(shù)不是9 就很好解決
digits[n-1] += 1
return digits
flag = False # 如果數(shù)組里全是9,則flag值為True
for i in range(n-1, -1, -1):
if digits[i] == 9: # 逆向找9
digits[i] = 0
if i == 0:
flag = True
else: # 逆向找到不是9,就可以停了
digits[i] += 1
break
if flag == True:
digits.insert(0, 1) # 如果數(shù)組里全是9,在頭部填1
return digits
88. 合并兩個有序數(shù)組
題目描述:給你兩個有序整數(shù)數(shù)組 nums1 和 nums2,請你將 nums2 合并到 nums1 中,使 nums1 成為一個有序數(shù)組。
輸入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
輸出:[1,2,2,3,5,6]
思考:如果你想正向的填數(shù),那代碼會出現(xiàn)很多判斷和切片賦值。學(xué)會逆向思考。
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
"""
Do not return anything, modify nums1 in-place instead.
"""
if n == 0: # 邊界條件
return nums1
idx_1 = m - 1 # nums1的下標(biāo)
jdx_2 = n - 1 # nums2的下標(biāo)
index_final = m + n - 1 # 最后返回的nums1的下標(biāo)
while jdx_2 >= 0 and idx_1 >= 0: # 逆向循環(huán),找大填數(shù)
if nums1[idx_1] > nums2[jdx_2]:
nums1[index_final] = nums1[idx_1]
idx_1 = idx_1 - 1
else:
nums1[index_final] = nums2[jdx_2]
jdx_2 = jdx_2 - 1
index_final = index_final - 1
if index_final >= 0 and jdx_2 >= 0: # 如果nums2還有剩下的數(shù),全部仿真nums1的前端
nums1[0: index_final+1] = nums2[0: index_final+1]
return nums1
228. 匯總區(qū)間
題目:匯總區(qū)間
輸入:nums = [0,1,2,4,5,7]
輸出:["0->2","4->5","7"]
def summaryRanges(self, nums: List[int]) -> List[str]:
res = []
if len(nums) == 0:
return res
start = nums[0]
for i in range(0, len(nums)-1):
if nums[i] + 1 != nums[i+1]: # 查看數(shù)組間隔不為1就要輸出了
if start != nums[i]:
res.append(str(start) + '->' + str(nums[i]))
start = nums[i+1]
else:
res.append(str(start))
start = nums[i+1] # 記錄當(dāng)前的start
# 收尾工作
if start == nums[-1]: # 到達最后一個
res.append(str(start)) # 如果一樣只填一個數(shù)
else:
res.append(str(start) + '->' + str(nums[-1])) # 如果不一樣填一個區(qū)間
return res
283. 移動零
題目描述:給定一個數(shù)組 nums,編寫一個函數(shù)將所有 0 移動到數(shù)組的末尾,同時保持非零元素的相對順序。
輸入:[0,1,0,3,12]
輸出:[1,3,12,0,0]
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n = len(nums)
left = right = 0 # 雙指針法
while right < n:
if nums[right] != 0:
nums[left], nums[right] = nums[right], nums[left]
left += 1 # left用來記錄第幾個非0元素
right += 1 # 不停的循環(huán)向前移動