查找 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);
}
结果我得到了零。你能帮我找到我错误的地方吗?我想不通,因为讲师没有给出任何详细的解释。
您不需要所有这些循环:长度为 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(由我们知道此时必须true
的if
确定(,所以要替换的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;
}