给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
我:
1.先确定是不是999...,做特殊处理(因为多一位)。其他的从末尾加一,如果是9,就变动前一位,否则停止
class Solution(object):
def plusOne(self, digits):
flag=1
for i in range(len(digits)):
if digits[i]!=9:
flag=0 #表示不全为9
break
if flag==1:
for i in range(len(digits)):
digits[i]=0
digits[0]=1
digits.append(0)
return digits
#加1,从后向前看,位数一定不会变
i=len(digits)-1
while digits[i]==9:
digits[i]=0
i=i-1
digits[i]=digits[i]+1
return digits
2.(改进)一次从后向前一边看是不是9,一边加1,
若不是,加一即停。若是,变0,向前看。若看到了第一位,则第一位变1,最后补0
class Solution(object):
def plusOne(self, digits):
#加1,从后向前看,位数一定不会变
i=len(digits)-1
while i!=-1 and digits[i]==9:
digits[i]=0
i=i-1
if i==-1:
digits[0]=1
digits.append(0)
else:
digits[i]=digits[i]+1
return digits
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。
说明:
- 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。
- 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
我思路:
1.比较
2.插入时其他元素需要移动
(未通过,copy处用法还没找到)
class Solution(object):
def merge(self, nums1, m, nums2, n):
i=0
#特殊情况处理
if nums2==[]:
return nums1
if m==0:
nums1[:]=nums2[:]
return nums1
if nums1[m-1]<nums2[0]:
nums1[m:m+n]=nums2[:]
return nums1
for y in nums2:#依从将nums2的元素插入
while i < m and nums1[i]<=y:
i=i+1
#在大于的地方停下来,应插在i前面
#下一个循环时,从i+1开始比较
#将i至m-1处元素后移一格
j=m
while j>i: #若j=i=m,即i插在最后,则不用移动
nums1[j]=nums1[j-1]
j=j-1
nums1[i]=y
m=m+1#nums1元素个数加一
return nums1
官方:
1.先拼接再排序
class Solution(object):
def merge(self, nums1, m, nums2, n):
nums1[:]=sorted(nums1[:m]+nums2)
2.依从比较数组1,2的大元素,从后向前将大的插入nums1。谁成功了,谁的指针就可以往前移动
class Solution(object):
def merge(self, nums1, m, nums2, n):
i=m-1
j=n-1
p=m+n-1 #当前被插入的位置
while i>=0 and j>=0:
if nums1[i]>nums2[j]:
nums1[p]=nums1[i]
i=i-1
else:
nums1[p]=nums2[j]
j=j-1
p-=1 #每填好一个,p要移动
#若n2先用完,则n1剩下的元素已经在前面了,不用动,
#但若n1,先用完,则需要将n2剩下的元素搬到n1的前面(此时n1前面原有的元素已经复制到后段了,不用担心覆盖)
#if j>=0: 不用这句,因为j=-1[:0]不会执行
#
nums1[:j+1]=nums2[:j+1] #j+1,因为切片[:x]是切到下标为x-1