AI 刷题-矩阵转置计算 | 豆包MarsCode AI刷题

71 阅读4分钟
矩阵转置计算

问题描述

小U拿到一个大小为nxn的矩阵。她需要计算该矩阵的转置权值。转置权值的定义如下.

1.将矩阵进行转置操作,转置后的矩阵中的元素 b[i][j] 与原矩阵中的元素 a[j][i] 互换位置。

2.对于每个位置(i,j),计算原矩阵的元素与转置矩阵对应位置元素的差的绝对值。

3.最后,将所有差的绝对值累加起来,得出转置权值。

测试样例

样例1:

输入:n=2,a=[[1,2],[3,4]]输出:2

样例2:

输入:n=3,a=[[1,2,3],[4,5,6],[7,8,9]]输出:16

样例3:

输入:n=4,a=[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]输出:20

  1. 计算转置矩阵:我们使用列表推导式来计算矩阵的转置。transposed[i][j] 等于 a[j][i]
  2. 计算转置权值:我们遍历原矩阵 a 和转置矩阵 transposed,计算每个位置 (i, j) 上元素差的绝对值,并累加到 transpose_weight 中。
  3. 返回结果:最后返回计算得到的转置权值
def solution(n: int, a: list) -> int:
    # 计算转置矩阵
    transposed = [[a[j][i] for j in range(n)] for i in range(n)]
    
    # 计算转置权值
    transpose_weight = 0
    for i in range(n):
        for j in range(n):
            transpose_weight += abs(a[i][j] - transposed[i][j])
    
    return transpose_weight

if __name__ == '__main__':
    print(solution(2, [[1, 2], [3, 4]]) == 2)
    print(solution(3, [[1, 2, 3], [4, 5, 6], [7, 8, 9]]) == 16)
    print(solution(4, [[1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3], [4, 4, 4, 4]]) == 20)
字典序最小的01字符串
问题描述

小U拥有一个由0和1组成的字符串,她可以进行最多k次操作,每次操作可以交换相邻的两个字符。日标是通过这些操作,使得最终得到的字符串字典序最小。

例如,小U当前有一个字符串 01018,她最多可以进行2次相邻字符交换操作。通过这些操作,她可以将字符串调整为 80101,这是可以通过不超过2次操作得到的字典序最小的字符串。

现在,小U想知道,经过最多k次操作后,能够得到的字典序最小的字符串是什么。

测试样例

样例1:

输入:n=5,k=2,s="01010"输出:'00101

样例2:

输入:n=7,k=3,s="1101001"输出:'0110101

样例3:

输入:n=4,k=1,s="1001"输出:'011

解题思路
  1. 将字符串转换为列表:由于字符串在 Python 中是不可变的,所以为了便于交换操作,我们首先将字符串 s 转换为字符列表。
  2. 遍历字符串的每个位置:从第一个字符开始,一直到字符串的末尾。
  3. 寻找第一个 '1' :在遍历过程中,找到第一个字符为 '1' 的位置 i
  4. 尝试交换 '1' 和它后面的 '0'
    • 从位置 i 开始,向后查找最近的 '0',范围是在 [i+1, min(i+k+1, n)) 内。这样可以保证交换操作不会超过 k 次。
    • 如果在这个范围内找到了 '0',就将当前的 '1' 与找到的 '0' 交换位置。
    • 每次交换后,减少剩余的操作次数 k
  1. 更新操作次数:每次交换后,更新操作次数 k,减少的值是交换的两个字符之间的距离。
  2. 结束条件:如果操作次数 k 用完了,或者已经遍历完整个字符串,结束循环。
  3. 将列表转换回字符串:最后,将字符列表转换回字符串,并返回这个结果。
代码实现
def solution(n: int, k: int, s: str) -> str:
    s = list(s)  # 将字符串转换为列表,以便于交换操作
    for i in range(n):
        if k == 0:  # 如果操作次数已经用完,结束循环
            break
        if s[i] == '1':  # 如果当前字符是'1'
            for j in range(i + 1, min(n, i + k + 1)):  # 尝试将'1'与后面的'0'交换
                if s[j] == '0':  # 找到后面的一个'0'
                    s[i], s[j] = s[j], s[i]  # 交换'1'和'0'
                    k -= j - i  # 减少操作次数
                    break  # 退出内层循环
    return ''.join(s)  # 将列表转换回字符串并返回

if __name__ == '__main__':
    print(solution(5, 2, "01010") == '00101')
    print(solution(7, 3, "1101001") == '0110101')
    print(solution(4, 1, "1001") == '0101')