Почему эта функция Swift возвращает индекс массива вне диапазона? - PullRequest
0 голосов
/ 27 сентября 2019

Итак, я пытаюсь решить проблему удаления дубликатов из отсортированного массива в коде Leet с помощью следующей функции.Но когда он тестируется с [1,1] в качестве входных данных, я получаю, что индекс Array выходит за пределы диапазона, хотя у меня есть некоторая условная логика, которая должна поймать этот случай, не вызывая выход индекса Array вне диапазона.Еще более запутанно: он работает на игровых площадках Xcode 11.1, но не с какой-либо версией кода Swift Leet.

class Solution {
   func removeDuplicates(_ nums: inout [Int]) -> Int {
    var slowPointer = 0
    var fastPointer = 1

    if nums.count < 2 {
        return nums.count
    }

    if nums.count == 2 {
        if nums[slowPointer] == nums[fastPointer] {
            nums.remove(at: 1)
        }
        return 2
    }

    while fastPointer < nums.count {


        while nums[fastPointer] == nums[slowPointer] {
            fastPointer += 1
        }

        if fastPointer < nums.count {
            slowPointer += 1
            nums[slowPointer] = nums[fastPointer]
            fastPointer += 1
        }

        print(slowPointer, fastPointer)
    }

    return (slowPointer + 1)

    }
}

Вот трассировка стека:

Fatal error: Array index is out of range
Current stack trace:
0    libswiftCore.so                    0x00007f75269f5050 _swift_stdlib_reportFatalError + 69
1    libswiftCore.so                    0x00007f7526902dc6 <unavailable> + 3280326
2    libswiftCore.so                    0x00007f7526903145 <unavailable> + 3281221
3    libswiftCore.so                    0x00007f7526921043 <unavailable> + 3403843
4    libswiftCore.so                    0x00007f7526714b10 Array.subscript.getter + 39
5                                       0x00005595496f1a40 <unavailable> + 19008
6                                       0x00005595496f1054 <unavailable> + 16468
7    libc.so.6                          0x00007f7524836740 __libc_start_main + 240
8                                       0x00005595496f0dd9 <unavailable> + 15833

1 Ответ

0 голосов
/ 27 сентября 2019

Этот код выглядит неправильно:

if nums.count == 2 {
    if nums[slowPointer] == nums[fastPointer] {
        nums.remove(at: 1)
    }
    return 2
}

Если nums.count равно 2, и две записи совпадают (ваш случай [1,1], вы сначала удаляете один из объектов, а затем возвращаете2. Таким образом, в этом случае вы возвращаете массив, содержащий один элемент, но счет 2. 2. 1006 *

Чтобы исправить свой код, верните nums.count, а не 2, для этого случая:

if nums.count == 2 {
    if nums[slowPointer] == nums[fastPointer] {
        nums.remove(at: 1)
    }
    nums.count
}

Редактировать: Комментарий ниже является неправильным.

Обратите внимание, что даже если вы исправите эту ошибку, ваш код будет иметь производительность O (N ^ 2). Это не хорошо.

...