2016-12-20 2 views
0

Я пытаюсь написать программу для данного массива и значение, чтобы удалить все экземпляры этого значения на месте и вернуть новую длину.Python array slice не работает как ожидалось

Пример: Учитывая НУМС входной массив = [3,2,2,3], Val = 3

Она должна возвращать длина = 2, с двумя первыми элементами НУМС быть 2.

Вот мой код:

код 1:

def removeElement(self, nums, val): 
    """ 
    :type nums: List[int] 
    :type val: int 
    :rtype: int 
    """ 
    i = 0 
    j = len(nums) - 1 

    while i <= j: 
     while i <= j and nums[j] != val: 
      j -= 1 

     while i <= j and nums[i] == val: 
      i += 1 

     if i <= j: 
      nums[i], nums[j] = nums[j], nums[i] 

    return len(nums[i:]) 

Это возвращает срез массива в обратном порядке.

Input: 
[3,2,2,3] 
3 
Output: [3,3] 
Expected: [2,2] 

Однако, если я делаю небольшие изменения в конце кода 1, это дает мне правильный вывод:

nums[:] = nums[i:] 
    return len(nums[i:]) 

Код 2:

def removeElement(self, nums, val): 
    """ 
    :type nums: List[int] 
    :type val: int 
    :rtype: int 
    """ 
    i = 0 
    j = len(nums) - 1 

    while i <= j: 
     while i <= j and nums[j] != val: 
      j -= 1 

     while i <= j and nums[i] == val: 
      i += 1 

     if i <= j: 
      nums[i], nums[j] = nums[j], nums[i] 

    nums[:] = nums[i:] 
    return len(nums) 

Я не могу выяснить, почему мой код 1 не работает. Может ли кто-нибудь помочь мне понять, почему срез не работает должным образом?

+1

Я не думаю, что любой подход работает, если у вас нет ограничений на вход, который вы не упомянули. –

+0

Странно, что я запустил ваш код1, и он работал, как ожидалось, т. Е. С входом [3,2,2,3] возвращается [2,2] и длиной 2. – Nurjan

ответ

2

Это будет делать то, что вы собираетесь ("... удалить все экземпляры этого значения на месте и возвращает новую длину"):

def remove_element(nums, val): 
    nums[:] = [x for x in nums if x != val] 
    return len(nums) 

Тест:

nums = [3, 2, 2, 3] 
val = 3 
print(remove_element(nums, val)) 
print(nums) 

Выход:

2 
[2, 2] 
+0

Решает ли ваша проблема ваша проблема? –

0

Ваш первый пример работы.

Когда вы нарезаете новый список. Поэтому в вашем первом примере кода вы создаете новый список в конце, содержащий правильный результат, но не возвращающий его.

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

Смежные вопросы