27. Удалить элементы (кнопка Rip)

Оглавление

27. Удалить элементы

ход мыслей

Код (язык C)

код (java) два 

ход мыслей 


 

27. Удалить элементы

Учитывая массив  nums и значение  val, вам нужно   удалить все элементы, равные значению  на местеval  , и вернуть новую длину удаленного массива.

Не используйте дополнительное пространство массива, вы должны использовать только  O(1) дополнительное пространство и  изменять входной массив на месте  .

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

проиллюстрировать:

Почему возвращаемое значение является целым числом, а выходной ответ представляет собой массив?

Обратите внимание, что входной массив передается « по ссылке» , что означает, что изменения входного массива внутри функции видны вызывающей стороне.

Вы можете представить внутреннюю операцию следующим образом:

// nums передается по "ссылке". То есть без копирования реальных параметров
int len ​​= removeElement (числа, значения);

// Модификации входного массива в функции видны вызывающей стороне.
// В соответствии с длиной, возвращаемой вашей функцией, она распечатает все элементы массива в пределах диапазона длин .
for (int i = 0; i < len; i++) {
    печать (числа [я]);
}

Пример 1:

Ввод: nums = [3,2,2,3], val = 3
 Вывод: 2, nums = [2,2]
 Объяснение: Функция должна возвращать новую длину 2 , а  первые два элемента в nums равны 2 . Вам не нужно рассматривать элементы в массиве за пределами новой длины. Например, новая длина, возвращаемая функцией, равна 2, а nums = [2,2,3,3] или nums = [2,2,0,0] также будет считаться правильным ответом.

Пример 2:

Ввод: числа = [0,1,2,2,3,0,4,2], знач = 2

Выход: 5, числа = [0,1,4,0,3]

Объяснение: функция должна вернуть новую длину 5, а первые пять элементов в nums — это 0, 1, 3, 0, 4. Обратите внимание, что эти пять элементов могут быть в любом порядке. Вам не нужно рассматривать элементы в массиве за пределами новой длины.

Ссылка на тему: https://leetcode.cn/problems/remove-element/

ход мыслей

Примечание: напишите <=numsSze (т.к. i=1), иначе (i-1) не дойдет до последней цифры, и цикл завершится

Код (язык C)

int removeElement(int* nums, int numsSize, int val)
{
    int i = 0;
    for(i = 1; i <= numsSize; i++)
    {
        if(nums[i - 1] == val)
        {
           int j = 0;
           for(j = i;j < numsSize; j++)
           {
               nums[j- 1]= nums[j];
           }
           numsSize--;
           i--;
        }
    }
    return numsSize;
}

код (java) два 

ход мыслей 

Найдено, что он такой же, как и предыдущий (медленный), быстрый будет двигаться вперед на один бит, пока не достигнет неравной позиции, затем пусть медленный бит будет равен быстрому биту, таким образом пропуская эти равные числа 

public class Solution {
    public int removeElement(int[] nums, int val) {
        int fast = 1;//快的
        int slow = 0;//走的慢的
        while(fast < nums.length){
            if(nums[fast] == nums[slow]){
                fast++;//发现和前面的(slow - 1),就往前走一位
            }else {
                nums[slow] = nums[fast];//直到走到不相等的位置,那就让slow位的等于快的位的,这样就跳过了那些相等的数
                slow++;
                fast++;
            }
        }
        return slow + 1;
    }
}

//或者整合成这样,更快
class Solution2 {
    public int removeElement(int[] nums, int val) {
        int fast = 0;//快的
        int slow = 0;//走的慢的
        while(fast < nums.length){
            if(nums[fast] != val){
                nums[slow] = nums[fast];//直到走到不相等的位置,那就让slow位的等于快的位的,这样就跳过了那些相等的数
                slow++;
            }
            fast++;
        }
        return slow;
    }
}

Guess you like

Origin blog.csdn.net/iiiiiihuang/article/details/130287214