【问题标题】:How can I check if 2d array is unique only with for loops如何仅使用 for 循环检查 2d 数组是否唯一
【发布时间】:2019-06-29 04:47:03
【问题描述】:

我将如何检查列和行的重复项并根据是否存在重复项返回真或假。例如

1 2 3

3 1 2

2 3 1

会返回 true,因为没有重复,但是..

1 2 2

3 2 3

2 1 1

将返回 false,因为第 2 列 {2, 2, 1} 中有重复项。

我将如何检查行中是否存在重复项,然后检查列中是否存在重复项?

我还需要检查每个数字以与同一行和同一列上的其他数字进行比较

到目前为止,我只有以下内容:

 for (int row = 0; row < n; row++)
        {
            for (int col = 0; col < m; col++)
            {

                Console.WriteLine("Check for: " + arr[row, col]);
                for (int i = 1; i < arr.GetLength(1); i++)
                {
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[i, col]);
                    if (col != i)
                    {
                        if (arr[row, col] == arr[i, col])
                        {
                            unique = false;
                        }
                    }

                }
                for (int j = 1; j < arr.GetLength(0); j++)
                {
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[row, j]);
                    if (row != j)
                    {
                        if (arr[row, col] == arr[row, j])
                        {
                            unique = false;
                        }
                    }



                }

自 2 天以来,我一直坚持该分配,我不知道如何对最后两个 for 循环进行正确检查。 此外,我应该只使用 for 循环,并且只使用 2d 数组而不是锯齿状或 HashSets 。

提前谢谢你。

嘿,伙计们,大家能够检查每个单行和列中的每个数字,以便在仅使用 for 循环时获得 2d 中的唯一矩阵,您的行和列的 for 循环应该从 0 开始,并且循环取决于对于行,宽度和高度的列,那么最重要的是在 if 语句中,所以当循环开始时并检查检查列的索引和行的索引是否与它检查的数字相同必须继续然后您转到第二个 if 语句,即行或列的索引是否与当前所在的行或列不同,并且行数组和 col == 索引数组,col 或行数组,索引然后矩阵不是唯一的。我也会发布代码,以便您看到最终结果。感谢所有帮助我的人引导我走向正确的方向

for (int row = 0; row < arr.GetLength(0); row++)
        {
            for (int col = 0; col < arr.GetLength(1); col++)
            {

                Console.WriteLine("Check for: " + arr[row, col]);
                for (int i = 0; i < arr.GetLength(0); i++)
                {
                    if (i == row)
                    {
                        continue;
                    }
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[i, col]);
                    if (i != row && arr[row, col] == arr[i, col])
                    {
                        unique = false;
                    }
                }
                for (int j = 0; j < arr.GetLength(1); j++)
                {
                    if (j == col)
                    {
                        continue;
                    }
                    Console.WriteLine("{0} == {1}", arr[row, col], arr[row, j]);
                    if (j != col && arr[row, col] == arr[row, j])
                    {
                        unique = false;
                    }
                }

            }
        }

【问题讨论】:

  • 如果有 3 列,那么这三列中的数字是否总是 1、2 和 3?或者它们可以是其他数字(例如 1、2 和 4)?我问的原因是,如果它们只能是 1、2 和 3,那么问题就简单得多了。
  • 它甚至可以是 123,456,789,因为这是一个唯一的矩阵
  • 那么,作为一个例子,如果数组的第一行包含 4 和 89 和 123 是否有效?
  • 能否请您添加一个minimal reproducible example:工作代码,包括您正在使用的数组?

标签: c#


【解决方案1】:

我建议使用检查序列是否重复的辅助方法。您可以对行和列使用相同的算法。

        public bool SequenceHasDuplicateSymbols(char[] sequence) {

            char symbolToCheckFor;         
            for (int i = 0; i < sequence.Length; i++)
            {
                symbolToCheckFor = sequence[i];

                for (int j = 0; j < sequence.Length; j++)
                {
                    if (i != j)
                    {
                        if (symbolToCheckFor == sequence[j])
                        {
                            return true;
                        }
                    }
                }
            }

            return false;
        }

【讨论】:

    【解决方案2】:
    int[,] arr = new int[,] { { 1, 2, 3 }, { 3, 1, 2 }, { 2, 3, 1 } };
    // int[,] arr = new int[,] { { 1, 2, 2 }, { 3, 2, 3 }, { 2, 1, 1 } };
    int r = arr.GetLength(0), c = arr.GetLength(1);
    bool unique = true;
    
    for (int row = 0; row < r; row++)
        for (int col = 0; col < c; col++)
        {
            for (int i = row + 1; i < r; i++)
                if (arr[row, col] == arr[i, col])
                {
                    unique = false;
                    break;
                }
    
            for (int j = col + 1; j < r; j++)
                if (arr[row, col] == arr[row, j])
                {
                    unique = false;
                    break;
                }
        }
    Console.WriteLine(unique);
    

    如果你的数组总是方形的(Col == Row),你可以使用它。少一个循环。

    // int[,] arr = new int[,] { { 1, 2, 3 }, { 3, 1, 2 }, { 2, 3, 1 } };
    int[,] arr = new int[,] { { 1, 2, 2 }, { 3, 2, 3 }, { 2, 1, 1 } };
    
    int len = arr.GetLength(0);
    bool unique = true;
    
    for (int x = 0; x < len; x++)
    {
        for (int r = 0; r < len; r++)
            if (r != x && arr[x, x] == arr[r, x])
            {
                unique = false;
                break;
            }
    
        for (int c = x + 1; c < len; c++)
            if (c != x && arr[x, x] == arr[x, c])
            {
                unique = false;
                break;
            }
    }
    Console.WriteLine(unique);
    

    【讨论】:

    • 所以实际上我正在使用控制台的输入,所以我尝试了你的答案,它没有用我会发布我的 entier 代码以便你可以看到
    • 问题是我不能在这里发布。我可以给你发私信吗
    • 我们可以在这里发送社交媒体 ID 吗?例如 WhatsApp id 或 Telegram id 等。也许 Github 或 Gitlab 是更好的选择。
    【解决方案3】:

    所以,你想检查你的行和列是否有重复,有点像数独。

    我建议您创建一个辅助方法来检查数组中的重复项,然后对每一行和每一列运行一次此方法。

    private bool checkForDuplicateInArray(int[] arr)
        {
            var result = false;
            foreach (int i in arr)
            {
                foreach (int j in arr)
                {
                    if (arr[i] == arr[j] && i != j)
                    {
                        result = true;
                    }
                }
            }
    
            return result
        }
    

    现在您只需将二维数组拆分为行和列并使用它运行方法。

            var result = true;
    
            // rows
            for (int i = 0; i < arr2d.Length; i++)
            {
                int[] arrToCheck = new int[arr2d[i].Length];
                for (int j = 0; j < arr2d[i].Length; j++)
                {
                    arrToCheck[j] = arr2d[i][j];
                }
                if(!checkForDuplicateInArray(arrToCheck))
                {
                    result = false;
                }
            }
    
            // columns
            for (int i = 0; i < arr2d[0].Length; i++)
            {
                int[] arrToCheck = new int[arr2d.Length];
                for (int j = 0; j < arr2d.Length; j++)
                {
                    arrToCheck[j] = arr2d[j][i];
                }
                if (!checkForDuplicateInArray(arrToCheck))
                {
                    result = false;
                }
            }
    

    编辑:假设整体正确意味着没有重复

    【讨论】:

      猜你喜欢
      • 2012-03-04
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2021-05-21
      • 2014-06-22
      • 2019-10-16
      • 2021-12-24
      相关资源
      最近更新 更多