Не могу найти проблему в моем коде для ассортимента массива в Java - PullRequest
0 голосов
/ 31 января 2020

Итак, у меня есть назначение, мне нужно повернуть все 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

Ответы [ 3 ]

1 голос
/ 31 января 2020

Ваша проблема исходит от второго л oop. Так как вы начинаете с с конца массива, ваш второй l oop считает, что у вас встречается 0 в конце массива, что, очевидно, не здесь дело.

Таким образом, согласно вашему коду в вашем втором l oop if (a[i] > counter) будет истинным, поскольку a[1] равно 2 и counter равен 1 в вашей первой итерации, что приводит к тому, что ваш последний член вашего массива равен 1. В вашем результате

Как говорили другие люди. Не меняйте значения, пока не встретите ноль. Не думайте, что конец вашего массива равен 0. Если вы хотите решить проблему, вы можете установить counter = a[a.length - 1]; перед вторым l oop. Но это не очень сексуально, я думаю, вы можете придумать другой подход к вашей проблеме.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ

Как Робби указал. Вы также столкнетесь с проблемой в своем первом l oop, если у вас в начале будет 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]);
}

Конечно, есть лучший способ сделать это. Я сделал это в ru sh извините за это.

0 голосов
/ 31 января 2020

Логика c, которую вы написали во второй части кода, неверна.

 `if (a[i] != 0)
    {
        counter++;
        if (a[i] > counter)
            a[i] = counter;
    }`

Вы устанавливаете последний элемент на 1 во всех случаях, не зная расстояние элемента от ближайший 0. Даже если последний элемент был на расстоянии 5 от ближайшего 0, ваш код установит для [lastelement] значение 1. Это неверно.

Вы можете попробовать код ниже-

    public static void zeroDistance(int[] a)
    {
        int[] ans = new int[a.length];
        if (a[0] == 0)
            ans[0] = 0;
        else
            ans[0] = 10000; // if not 0 then initialize  
                              // with a maximum value 

        // traverse in loop from 1 to n and store  
        // the distance from left 
        for (int i = 1; i < a.length; ++i)
        {

            // add 1 to the distance from previous one 
            ans[i] = ans[i - 1] + 1;

            // if the present element is 0 then distance 
            // will be 0 
            if (a[i] == 0)
                ans[i] = 0;
        }

        // if last element is zero then it will be 0 else  
        // let the answer be what was found when traveled 
        // form left to right 
        if (a[a.length - 1] == 0)
            ans[a.length - 1] = 0;

        // traverse from right to left and store the minimum 
        // of distance if found from right to left or left 
        // to right 
        for (int i = a.length - 2; i >= 0; --i)
        {

            // store the minimum of distance from left to 
            // right or right to left 
            ans[i] = ans[i] < ans[i + 1] + 1 ? ans[i] : ans[i+1] + 1;

            // if it is 0 then minimum will always be 0 
            if (a[i] == 0)
                ans[i] = 0;
        }
       // print the answer array 
        for (int i = 0; i < n; ++i)
            System.out.println(ans[i] + " ");

    }
0 голосов
/ 31 января 2020

Вы не должны изменять никакие значения, прежде чем встретите первый ноль.

Вы можете сделать это, используя дополнительный флаг, в котором вы отслеживаете, был ли обнаружен ноль в текущем проходе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...