我遇到了这个问题
给定一个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);
}
结果我得零。你能帮我找到我错的地方吗?我无法理解,因为讲师没有详细解释。
答案 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;
}