我有5x5矩阵,需要将重复的数字替换为零



我有一个5x5矩阵,我需要将重复的数字替换为零。我正在尝试创建5x5矩阵,其中包含多维数组和用于比较值的一维数组。但它出乎意料地出现了。我做错了什么?

using System;
namespace labr6 {
class Program
{
static void Main(string[] args)
{
Random r = new Random();
int[,] mas = new int[5, 5];
int[] val = new int[10];
for (int c = 0; c < 10; c++)
{
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
mas[i, j] = r.Next(1, 100);
val[c] = r.Next(1, 100);

foreach (int x in mas)
{
if (x == val[c])
{
mas[i, j] = 0;
}
}
Console.Write(mas[i, j] + " ");

}

Console.WriteLine();
}

}
}
} }

通过暴力,您可以比较矩阵中的每一项。但是,有一种更有效的方法,你可以使用哈希表来执行它在O(n*m(中运行的比较,其中n和m是矩阵的大小,类似于这样:

int[,] arr = new int[5, 5] {
{1, 2, 6, 2, 1 }, 
{4, 1, 5, 3, 4 }, 
{6, 1, 8, 9, 8 },
{6, 2, 4, 1, 0 },
{3, 1, 8, 7, 9 },
};

HashSet<int> unique = new HashSet<int>();

for(int i = 0; i < arr.GetLength(0); i++)
{
for(int j = 0; j < arr.GetLength(1); j++)
{
if (arr[i,j] != 0 && !unique.Add(arr[i,j]))
{
arr[i,j] = 0;  // Not unique, replace with 0
}
}
}

// Print the arr
for (int i = 0; i < arr.GetLength(0); i++)
{
for (int j = 0; j < arr.GetLength(1); j++) {
Console.Write("{0} ", arr[i, j]);
}
Console.WriteLine();
}

您可以在此处看到实现的详细信息:https://dotnetfiddle.net/UZZjNk

如果需要对1D数组执行比较,可以修改上面的代码片段,并首先将1D数组添加到哈希表中。

最新更新