Task02:数组基础(习题与反思)

第三天

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 最富有客户的资产总量

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值