所以我有一个作业,我需要将数组中的所有 1 转换为距最近的 0 的距离。 因此,当我运行它时,输出中的最后一个数字保持为 1,而它本应更改为 2。 有人可以帮我发现我的错误吗?
基本上,zeroDistance 的作用是传递一次数组,更改所有值,然后从后面运行并再次更改所有值。
public static void zeroDistance (int [] a)
{
int counter = 0;
for (int i = 0; i < a.length; i++)
{
if (a[i] == 0)
counter = 0;
if (a[i] == 1)
{
counter++;
a[i] = counter;
}
}
counter = 0;
for (int i = a.length - 1; i >= 0; i--)
{
if (a[i] == 0)
counter = 0;
if (a[i] != 0)
{
counter++;
if (a[i] > counter)
a[i] = counter;
}
}
}
输入:
int[] a={0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1};
输出:
zeroDistance method result :
0, 1, 2, 3, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 1
Should return :
0, 1, 2, 3, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, 2
最佳答案
您的问题来自第二个循环。由于您从数组末尾开始,因此第二个循环认为您在数组末尾遇到了 0,这显然不是 案例在这里。
因此,根据第二个循环中的代码,if (a[i] > counter)
将为 true,因为 a[1]
是 2 和 counter
is 1 在第一次迭代中,这导致数组的最后一个成员在结果中为 1。
正如其他人所说。在遇到零之前不要更改值。不要假设数组的末尾是 0。如果您想解决问题,可以在第二个循环之前设置 counter = a[a.length - 1];
。但这不是很性感,我认为你可以想出另一种方法来解决你的问题。
希望这有帮助。
编辑
正如罗比指出的那样。如果开头有 1,您也会在第一个循环中遇到问题。
话虽这么说,这是一个似乎对我有用的版本。请毫不犹豫地指出任何错误。
public static void zeroDistance (int[] a)
{
List<Integer> zerosCoordinates = new ArrayList<>();
for (int i = 0; i < a.length; i++) {
if (a[i] == 0)
zerosCoordinates.add(i);
}
for(int i : zerosCoordinates) {
for (int j = i - 1, k = 1; j >= 0; j--, k++) {
if (a[j] == 0)
break;
if (a[j] != 0 && a[j] < k)
a[j] = k;
}
}
for (int i : zerosCoordinates) {
for (int j = i + 1, k = 1; j < a.length; j++, k++) {
if (a[j] == 0)
break;
if (a[j] != 0 && a[j] > k || j == a.length - 1)
a[j] = k;
}
}
for (int i = 0; i < a.length; i++)
System.out.print(a[i]);
}
肯定有更好的方法来做到这一点。我是匆忙做的,对此感到抱歉。
关于java - 在我的 Java 数组分类代码中找不到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60000373/