如何在矩阵中插入不重复元素?现有代码重复检测异常求助
问题分析与修复
你的代码核心问题是没有检查当前行中已经输入的元素,只遍历了之前所有行的内容,导致同一行内的重复值完全无法被检测到;另外,原代码里的(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
相关产品推荐
相关产品推荐

