查找 C# 数组中元素的连续重复并更改元素

本文关键字:元素 数组 查找 连续 | 更新日期: 2023-09-27 18:19:48

我遇到了这个问题

给定一个 int 数组长度 3,

如果数组中有一个 2,紧跟一个 3,将 3 元素设置为 0。例如 ({1, 2, 3}( → {1, 2, 0} ({2, 3, 5}( → {2, 0, 5} ({1, 2, 1}( → {1, 2, 1}

这是我的实现。

int[] x = { 1, 2, 1 };
            for (int i = 0; i < x.Length; i++)
            {
                if (x[i] == 2 && x[i + 1] == 3)
                {
                    for (int j = 0; j < x.Length; j++)
                    {
                        if (x[j]==3)
                        {
                            x[j] = 0;
                        }
                    }
                }
            }
            foreach (int i in x)
            {
                Console.Write(i);
            }

结果我得到了零。你能帮我找到我错误的地方吗?我想不通,因为讲师没有给出任何详细的解释。

查找 C# 数组中元素的连续重复并更改元素

您不需要所有这些循环:长度为 3,您只需执行两次检查,如下所示:

if (x[0]==2 && x[1]==3) x[1] = 0;
if (x[1]==2 && x[2]==3) x[2] = 0;

对于任意大小的数组,可以使用单个循环:

for (var i = 0 ; i < x.Length-1 ; i++) {
    if (x[i]==2 && x[i+1]==3) x[i+1] = 0;
}

在你的代码中,你有一个适当的检查: if (x[i] == 2 && x[i + 1] == 3) 但是,有两件事可以改进。

1(如果你要做x[i + 1]你需要确保i永远不能是数组的最后一个元素,因为+ 1会溢出数组。因此,与其在 for 循环中i < x.Length,不如尝试 i < x.Length - 1 .这看起来像管道胶带,但没有更好的方法(我知道没有

(。

2( 如果条件为 true,则您有一个for,它将查找数组中每 3 并将其替换为 0,无论 3 前面是否带有 2。你已经知道x[i]是2,x[i + 1]是3(由我们知道此时必须trueif确定(,所以要替换的3的索引是i + 1,因此:x[i + 1] = 0;不需要循环。

你可以用一个循环来做到这一点。

 // In the test part of the for loop, use ' i < x.Length - 1'
 // so you don't evaluate the last element + 1 and get an IndexOutOfRangeException
 for (int i = 0; i < x.Length - 1; i++) 
 {
    if (x[i] == 2 && x[i + 1] == 3)
       x[i + 1] = 0;
 }