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

时间:2012-01-10 04:26:46

标签: c# .net

我遇到了这个问题

给定一个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);
            }

结果我得零。你能帮我找到我错的地方吗?我无法理解,因为讲师没有详细解释。

3 个答案:

答案 0 :(得分:4)

您不需要所有这些循环:长度为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;
}

答案 1 :(得分:2)

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

1)如果你要做x[i + 1],你需要确保i永远不会是数组的最后一个元素,因为+ 1会溢出数组。因此,在for循环中不是i < x.Length,而是尝试i < x.Length - 1。这似乎是管道编带,但实际上没有更好的方法(我不知道)。

2)如果条件为真,那么你有一个for,它会找到并替换数组中的每个3,不管3是否以2开头。你已经知道{ {1}}为2且x[i]为3(由x[i + 1]确定,此时我们必须知道if),因此要替换的3的索引为{ {1}},因此:true无需循环。

答案 2 :(得分:1)

你可以用一个循环来完成它。

 // 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;
 }