程序员面试金典---4

字符串压缩

思路:

使用双指针进行模拟即可

class Solution:
    def compressString(self, S: str) -> str:
        res = []
        # i:左指针,j:右指针
        i, j, ls = 0, 0 ,len(S)
        while i < ls:
            # 记数当前字符的连续个数
            while j < ls and S[i] == S[j]:
                j += 1
            # 添加到结果数组
            res.append(S[i])
            res.append(str(j - i))
            # 左指针前进
            i = j
        # 拼接
        res = ''.join(res)
        # 输出
        return res if len(res) < ls else S

旋转矩阵

旋转公式:

matrix[i][j]=matrix[nj1][i]

matrix[nj1][i]=matrix[ni1][nj1]

matrix[ni1][nj1]=matrix[j][ni1]

matrix[j][ni1]=matrix[i][j]

其中i为循环行数至n//2j为循环列数至(n+1)//2n为行列数

因此,代码为:

class Solution:
   def rotate(self, matrix: List[List[int]]) -> None:
       """
       Do not return anything, modify matrix in-place instead.
       """
       n = len(matrix)

       for i in range(n // 2):
           for j in range((n + 1) // 2):
               matrix[i][j], matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1] = matrix[n - j - 1][i], matrix[n - i - 1][n - j - 1], matrix[j][n - i - 1], matrix[i][j]

零矩阵

思路:

设置两个列表记录哪里需要置零,然后对其改变即可

class Solution:
    def setZeroes(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        n, m = len(matrix), len(matrix[0])
        # 判断列表
        rows, cols = [False] * n, [False] * m

        for i in range(n):
            for j in range(m):
                if matrix[i][j] == 0:
                    # 某一个为0,将其行列记下
                    rows[i] = cols[j] = True
        
        for i in range(n):
            for j in range(m):
                # 如果某一个的行列别记下了为0,则直接置为0
                matrix[i][j] =  0 if rows[i] or cols[j] else matrix[i][j]
posted @   楸枰~  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示