鱼C论坛

 找回密码
 立即注册
查看: 221|回复: 3

代码求助

[复制链接]
发表于 2024-8-14 18:08:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lu315702820 于 2024-8-14 20:48 编辑

问题:请编程找出矩阵中的幸运数字。
说明:假设给定一个 m * n 的矩阵(矩阵中数值的取值范围是 0~1024,且各不相同),如果某一个元素的值在同一行的所有元素中最小,并且在同一列的所有元素中最大,那么该元素便是幸运数字。

假设给定的矩阵如下:
matrix = [[10, 36, 52],
                  [33, 24, 88],
                  [66, 76, 99]]
那么输出结果应该是 66(同时满足同一行的所有元素中最小,并且在同一列的所有元素中最大)。

我编写的代码:
matrix = [[10, 36, 52],
              [33, 24, 88],
              [66, 76, 99]]

row_min = [1024] * 3
col_max = [0] * 3
for i in range(len(matrix)):
    for j in range(len(matrix[0])):
        if row_min[i] > matrix[i][j]:
            row_min[i] = matrix[i][j]
        else:
            row_min[i] = row_min[i]
            
        if col_max[i] < matrix[j][i]:
            col_max[i] = matrix[j][i]
        else:
            col_max[i]= col_max[i]

for i in range(len(matrix)):
    for j in range(len(matrix[0])):
        if matrix[i][j] == row_min[i] and matrix[i][j] == col_max[i]:
            print(matrix[i][j])

我的想法是循环的时候,可以逐个让初始化的col_max列表每一个元素去分别和matrix的每一列的元素进行比较:
比如 1)当i = 1, j =0, col_max[1] = 0 < matrix[0][1] = 36,所以col_max[1] = 36
       2)当 i = 1, j =1, col_max[1] = 36 > matrix[1][1] = 24,  所以col_max[1] = 36
       3)当 i = 1, j =2, col_max[1] = 36 < matrix[2][1] = 76,  所以col_max[1] 被替换为76,

通过这样的方式也可以逐个将每一列最大的元素填入col_max中,但是输出不了结果;给出的标准答案我也看了,也理解,但是就是不知道为什么我尝试的这个方法做不出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-14 18:31:19 | 显示全部楼层
哎呀,我怎么觉得你的代码看起来像一只被打翻的鱼呢?有些元素在找不到新家,结果都是空的。别担心,让我给你理理思路,把这个矩阵的“幸运数字”捞出来!

首先,我们要理解什么是幸运数字:它必须在同一行是最小的,在同一列是最大的。我们可以走两步走的策略。

1. **找出每一行的最小值**。
2. **找出每一列的最大值**。
3. **检查每个最小值是否同时也是对应列的最大值**。

下面是一个简单且幽默的Python代码示例来实现这个逻辑:
def lucky_numbers(matrix):
    # 找到每一行的最小值
    row_mins = [min(row) for row in matrix]
    
    # 找到每一列的最大值
    col_maxs = [max(matrix[i][j] for i in range(len(matrix))) for j in range(len(matrix[0]))]
    
    lucky_numbers = []
    
    # 检查每一行的最小值是否是对应列的最大值
    for i in range(len(matrix)):
        for j in range(len(matrix[0])):
            if matrix[i][j] == row_mins[i] and matrix[i][j] == col_maxs[j]:
                lucky_numbers.append(matrix[i][j])
    
    return lucky_numbers

# 示例矩阵
matrix = [
    [36, 23, 76],
    [12, 66, 45],
    [78, 15, 92]
]

print(lucky_numbers(matrix))
让我们来看看这段代码是如何灵活运作的:

1. 我们用列表推导式找出了每一行的最小值 `row_mins`(真是个聪明的家伙,谁说鱼脑子不好使呢?)。
2. 同样的方法,我们为每一列找最大的值 `col_maxs`。
3. 接着,我们遍历这个矩阵,检查行最小值和列最大值是否相等,如果相等,那它就是我们的“幸运数字”,就像是真正的钓鱼高手钓到了大鱼!

运行这段代码,你就能看到输出的“幸运数字”啦!希望这能帮助你更好地理解问题,代码也更清晰了!如果还有其他问题或想法,随时来问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-15 11:10:57 | 显示全部楼层
def isRightData(data):
    d = []
    f = lambda x: True if all([type(a) is int for a in x]) else False
    for i in data:
        if type(i) is list and f(i) and 0 <= max(i) <= 1024 and len(i) == len(data[0]):
            d += i
        else:
            return False
    return len(d) == len(set(d))

def findLuckyNum(data):
    if not isRightData(data):
        raise ValueError('请使用合法数据!')
    
    data1 = [list(i) for i in zip(*data)]

    for row in data:
        min_row_num = min(row)
        min_index = row.index(min_row_num)
        
        col = data1[min_index]
        max_col_num = max(col)

        if min_row_num == max_col_num:
            return min_row_num
    else:
        return None

if __name__ == '__main__':
    matrix = [[10, 36, 52],
              [33, 24, 88],
              [66, 76, 99]]
    print(findLuckyNum(matrix))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-15 13:22:23 | 显示全部楼层
先寻找每一行的最小元素,再找该列的数据进行比对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-31 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表