You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在矩阵中插入不重复元素?现有代码重复检测异常求助

问题分析与修复

你的代码核心问题是没有检查当前行中已经输入的元素,只遍历了之前所有行的内容,导致同一行内的重复值完全无法被检测到;另外,原代码里的(k != i || l != j)判断是多余的——因为k的范围是0到i-1,根本不可能等于i,这个条件毫无意义。

修复后的代码

void duplicateMatrix(int **A, int n, int m)
{ 
    printf("populate matrix:\n");

    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < m; j++) {
            int duplicate;
 
            do {
                duplicate = 0; 
                scanf("%d", &A[i][j]); 

                // 先检查当前行中已经输入的列(j之前的元素)
                for (int l = 0; l < j; l++) {
                    if (A[i][l] == A[i][j]) {
                        duplicate = 1;
                        printf("Duplicate, insert another number!.\n");
                        break;
                    }
                }

                // 如果当前行没重复,再检查之前所有行的所有元素
                if (!duplicate) {
                    for (int k = 0; k < i; k++) {
                        for (int l = 0; l < m; l++) {
                            if (A[k][l] == A[i][j]) {
                                duplicate = 1;
                                printf("Duplicate, insert another number!.\n");
                                break;
                            }
                        }
                        if (duplicate) break;
                    }
                }
            } while (duplicate); 
        }
    }
}

优化建议(可选)

如果矩阵规模较大,每次遍历已填充元素的效率会很低,可以额外维护一个一维数组来记录所有已经输入过的数值,这样每次检查只需要遍历这个一维数组即可:

#include <stdlib.h>

void duplicateMatrix(int **A, int n, int m)
{ 
    printf("populate matrix:\n");
    int *used_nums = malloc(n * m * sizeof(int));
    int count = 0;

    for (int i = 0; i < n; i++) { 
        for (int j = 0; j < m; j++) {
            int duplicate;
 
            do {
                duplicate = 0; 
                scanf("%d", &A[i][j]); 

                // 检查已使用的所有数值
                for (int k = 0; k < count; k++) {
                    if (used_nums[k] == A[i][j]) {
                        duplicate = 1;
                        printf("Duplicate, insert another number!.\n");
                        break;
                    }
                }

                // 如果没有重复,记录到已使用数组中
                if (!duplicate) {
                    used_nums[count++] = A[i][j];
                }
            } while (duplicate); 
        }
    }

    free(used_nums);
}

内容的提问来源于stack exchange,提问作者Mina Capilli

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:50:07