第三天
1.0066.加一
描述:给定一个非负整数数组,数组每一位对应整数的一位数字。
要求:计算整数加 1 后的结果。
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
s ='' #建立一个字符串
l =[] #建立一个列表,用来存储新的整数
for i in range(len(digits)):
s += str(digits[i])
for n in str(int(s) + 1): #字符串转数字实现加一操作
l.append(int(n)) #添加到列表当中
return l
反思:原先本想在列表里直接实现加一的操作,但是没有考虑到会有位次的变换。在经过了一番苦想后,参考了部分题解,学到了这个方法,先把列表里的数字化为字符串再到数字实现加一后再存入列表中。很巧妙的解决了位次的变化,将对字符的操作转化为数字操作。
2.0724.寻找数组下标
描述:给定一个数组 nums.
要求:找到「左侧元素和」与「右侧元素和相等」的位置,若找不到,则返回 −1。
class Solution:
def pivotIndex(self, nums: List[int]) -> int:
sum_1,sum_2 = 0 , sum(nums) #左侧求和为0;右侧求和为sum(nums)
for i in range(len(nums)):
sum_2 -=nums[i]
#用右侧求和减去要判断的下标对应的值实现 i的右侧求和
if sum_1 == sum_2:
return i #若满足 i 的左右两侧和相等,则返回 i 结束函数
sum_1 += nums[i] #若不满足,则左侧求和加上 i ,并进行循环对下一个 i 进行判断
return -1 #表示没有 i 符合条件,则返回 -1
反思:在思考本题时,运用了和此相似的思路,但是编程出来却不能实现题目的要求。在学习了一部分的题解后,更新了自己的思路,又审视了一遍自己的代码,才逐渐完善。
3.0189.轮转数组
描述:给定一个数组 nums,再给定一个数字 k。
要求:将数组中的元素向右移动 k个位置。
#方法一:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k = k % len(nums)
nums[:] = nums[-k:] + nums[:-k]
return nums
#方法二
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(k):
nums.insert(0,nums[-1])
nums.pop()
return nums
反思:这题的话,花费的时间很长,自己写出来的程序虽然可以解决供给测试的两个例子,但是,在面临 n 很大时,却不能及时的解决,最后竟是超出时间限制。这让我很是苦恼。在浏览一些题解后,对以上两种方法感受很大。
方法一:是一个直接在数组上进行左移(或右移)的操作,这里使用了切片操作符 [:]
,表示对整个列表进行切片并替换为新的切片结果。通过 nums[-k:]
和 nums[:-k]
分别获取了右移后的后半部分和前半部分,并将它们连接起来赋值给 nums
。(这还是第一次见,真是涨见识了)
方法二:先将位于列表最后的数插入到列表的第一位,再把原来的列表最后删除掉。这个操作,让位于最后的元素换到了最前面,而相对地其他元素相当于自动右移了一位。(这个算法很聪明也很容易理解,但是它的耗时很长,时间复杂度较大。)
第四天
1.0048.旋转图像
描述:给定一个 m*n大小的二维矩阵(代表图像)matrix。
要求:将二维矩阵matrix顺时针旋转 90°。
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
"""
Do not return anything, modify matrix in-place instead.
"""
m = len(matrix)
n = len(matrix[0])
for i in range(m):
for j in range(i,n):
matrix[i][j],matrix[j][i] = matrix[j][i] , matrix[i][j]
for row in matrix:
row.reverse()
反思:在做这题时,能找到原位置与旋转后的位置的关系,但是在自己写代码的时候,却总是出错。在与朋友与交流和查看了一些题解后,决定使用将矩阵先转置,再逆向输出的方法。也认识到了一个没见过的函数reverse(),这个函数是把数组内的元素逆序输出。 虽然在解决这道题花费的时间较久,但是很有收获。
2.0054.螺旋矩阵
描述:给定一个 m×n大小的二维矩阵 matrix。
要求:按照顺时针旋转的顺序,返回矩阵中的所有元素。
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
if not matrix:return []
t,b,l,r,res = 0 , len(matrix)-1 , 0 , len(matrix[0])-1,[]
while True :
for i in range( l , r + 1):
res.append(matrix[t][i])
t +=1
if t > b : break
for i in range(t,b + 1):
res.append(matrix[i][r])
r -=1
if l > r :break
for i in range( r , l-1 ,-1 ):
res.append(matrix[b][i])
b -=1
if t > b: break
for i in range( b , t - 1 ,-1):
res.append(matrix[i][l])
l +=1
if l > r:break
return res
反思: 在解决这道题时,笔者能够有意识地做到注意边界,运用了多个if、else、for语句等来模拟遇到边界的情况,但这样既使代码不够简洁、十分冗长、臃肿又不能解决问题。于是浏览了一些题解后,对如何设出边界有了清晰的认识,借鉴了一些题解后写出了本题。
3.0498.对角线遍历
描述:给定一个大小为 m×n 的矩阵mat 。
要求:以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。
class Solution:
def findDiagonalOrder(self, mat: List[List[int]]) -> List[int]:
if len(mat) == 0:
return []
m = len(mat)
n = len(mat[0])
dirs=[[-1,1],[1,-1]]
result = []
row ,col, di =0 , 0 , 0
for i in range(m*n):
result.append(mat[row][col])
row = row + dirs[di][0]
col = col + dirs[di][1]
if col >= n:
col = n - 1
row += 2
di = 1- di
if row >= m:
row = m-1
col +=2
di = 1-di
if col <0:
col = 0
di = 1-di
if row < 0 :
row = 0
di = 1- di
return result
反思:说实话,第一次见到这题的时候想了很久,但是就是没思路。于是就到B站啊,CSDN上啊查了资料,终于在这位博主这里理解了做法(98.对角线遍历_Quiet_han的博客-CSDN博客),虽然博主是使用了java来解决,但是在python上也大同小异。最后解决了这题,感觉收获很多。
Task02反思:相对于Task01,Task02的任务难度感觉更加提升了一个档次。老实说,在进行Task02的任务时,没有一道题是不用去看题解和查资料的(lll¬ω¬),特别是在leetcode的题解中,有的大佬仅用几行代码就完成了,着实让人羡慕与钦佩。当然,我也会继续努力的(ง •_•)ง
附上Task01完成情况
01两整数相加
01 数组串联
01 宝石与石头
02一堆数组的动态和
02 转换成小写字母
02 最富有客户的资产总量