如何不使用内置transpose方法实现Ruby二维数组转置?
手动实现Ruby二维数组转置(不用内置transpose方法)
哈哈,时隔6年还能收到讨论这个问题的消息太惊喜了!我当初刚摸Ruby的时候也在这儿卡过一会儿,其实核心逻辑没那么复杂,就是把原数组的「行」和「列」索引互换就行~
实现思路
- 首先明确转置的本质:原数组第
j行第i列的元素,会变成转置后数组第i行第j列的元素 - 先处理空数组的边界情况,避免后续循环报错
- 初始化一个新的二维数组,行数等于原数组的列数,列数等于原数组的行数
- 通过双重循环遍历原数组,把对应位置的元素赋值到新数组里
具体代码实现
假设你的函数名必须是transpose,代码如下:
def transpose(matrix) # 处理空数组或空行的情况 return [] if matrix.empty? || matrix.first.empty? # 转置后的数组行数 = 原数组的列数,列数 = 原数组的行数 transposed_rows = matrix.first.length transposed_cols = matrix.length # 初始化转置后的数组结构 transposed_matrix = Array.new(transposed_rows) { Array.new(transposed_cols) } # 双重循环完成元素映射 transposed_rows.times do |i| transposed_cols.times do |j| transposed_matrix[i][j] = matrix[j][i] end end transposed_matrix end
测试验证
可以用几个例子测试一下效果:
# 测试方阵转置 square_matrix = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] puts transpose(square_matrix).inspect # 输出:[[1, 4, 7], [2, 5, 8], [3, 6, 9]] # 测试非方阵转置 non_square_matrix = [ [1, 2], [3, 4], [5, 6] ] puts transpose(non_square_matrix).inspect # 输出:[[1, 3, 5], [2, 4, 6]] # 测试空数组 puts transpose([]).inspect # 输出:[] puts transpose([[]]).inspect # 输出:[]
这个实现完全避开了内置的transpose方法,也没改函数名,输出结果和内置方法是一致的~
内容的提问来源于stack exchange,提问作者Justin Cefai
相关产品推荐
相关产品推荐

