Regista6 Ответов: 1

Учитывая массив nums, напишите функцию, чтобы переместить все 0 в конец его, сохраняя относительный порядок ненулевых элементов


Given an array nums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements
.
Пример:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]


Что я уже пробовал:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int count=0;
        for(int i=0;i<nums.size();i++)
        {
            if(nums[i]==0)
            {
                nums.erase(nums.begin()+i);
                ++count; //This is to count number of zeroes.
            }
        }
       for(int i=0;i<count;i++)
       
           nums.push_back(0);  //To input zero at the end of the vector count times.
       
}
};



Этот код показывает правильный вывод для входного сигнала :
[0,1,0,3,12]

но неправильный вывод для ввода:
[0,0,1]
.
Для ввода,
[0,0,1]
это показывает
[0,1,0]
- Так и должно быть
[1,0,0]

1 Ответов

Рейтинг:
8

Patrice T

Ваша проблема в том, что это

nums.erase(nums.begin()+i);

перемещает оставшиеся значения в вектор.
попробуйте это, чтобы увидеть, что происходит
for(int i=0;i<nums.size();i++)
{
    if(nums[i]==0)
    {
        nums.erase(nums.begin()+i);
        ++count; //This is to count number of zeroes.
    }
    else
    {
        // add 100 to each nont zero tested
        nums[i]+=100
    }
}

-----
Ваш код ведет себя не так, как вы ожидаете, и вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что вы должны делать, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.
Отладчик - Википедия, свободная энциклопедия[^]
1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]
Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.