java - 在我的 Java 数组分类代码中找不到问题

标签 java arrays sorting

所以我有一个作业,我需要将数组中的所有 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] 是 2counter 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/

相关文章:

javascript - 如何在 JavaScript 中将数组或字符串转换为数组?

java - 在 Firestore : detect if the operation is successful on the server, 本地存储文档还是不成功?

java - 正则表达式删除字符串中的最后一个单词+附加字符

java - 找到右边最小的大元素

arrays - 在 Golang 中将两个或多个 []map[string]interface{} 类型合并为一个

objective-c - 对 CGPoints 数组进行排序

java - 重量排序(克、毫克、升、毫升。)

sorting - Map Reduce Programming中reducer中洗牌和排序阶段的目的是什么?

java - 没有错误,但通过 HTTP 的对象不起作用?

java - JML 替代品