Нужна помощь в поиске ошибки logi c в массиве целых чисел, чтобы найти пары из K различных пар - PullRequest
0 голосов
/ 05 мая 2020

Попытка решить следующую задачу:

Учитывая массив целых чисел и целое число k, вам нужно найти количество уникальных пар k-diff в массиве. Здесь пара k-diff определяется как пара целых чисел (i, j), где i и j являются числами в массиве, а их абсолютная разница равна k.

Пример 1: Вход: [3, 1 , 4, 1, 5], k = 2 Выход: 2 Пояснение: В массиве есть две пары 2-diff: (1, 3) и (3, 5). Хотя у нас есть две единицы на входе, мы должны возвращать только количество уникальных пар.

Пример 2: Вход: [1, 2, 3, 4, 5], k = 1 Выход: 4 Пояснение: В массиве четыре пары 1-diff: (1, 2), (2, 3), (3, 4) и (4, 5).

Пример 3: Вход: [1, 3 , 1, 5, 4], k = 0 Вывод: 1 Объяснение: В массиве есть одна пара 0-diff, (1, 1).

Я написал следующий код:

const findPairs = (nums, k) => {
    let count = 0
    if (k < 0) return 0
    if (k === 0) {
        const hash = {}
        for (let num of nums) {
            hash[num] = (hash[num] || 0) + 1
        }
        nums = Object.keys(hash)
        for (let num of nums) {
            if (hash[num] > 1) count++
        }
    } else {
        let numSet = new Set(nums)
        nums = Array.from(numSet)
        for (let num of nums) {
            if (numSet.has(Math.abs(num + k))) {
                count++
                numSet.delete(Math.abs(num + k))
            }

        }
    }
    return count
}

Все тестовые примеры проходят, кроме последнего:

console.log(findPairs([3, 1, 4, 1, 5], 2)) //2
console.log(findPairs([1, 2, 3, 4, 5], 1)) //4
console.log(findPairs([1, 3, 1, 5, 4], 0)) //1
console.log(findPairs([1, 2, 3, 4, 5], -1)) //0
console.log(findPairs([1, 1, 1, 1, 1], 0)) //1
console.log(findPairs([1, 3, 1, 5, 4], 0)) //1
console.log(findPairs([-1, -2, -3], 1)) //2  my code returns 0 incorrectly

Нужна помощь в выяснении logi c недостаток.

1 Ответ

1 голос
/ 05 мая 2020

Ваш вызов Math.abs будет означать, что count будет увеличиваться только тогда, когда найден соответствующий элемент, который имеет положительное значение или ноль. В последнем примере у вас есть отрицательные элементы. Если вы удалите Math.abs, ваш код будет работать:

const findPairs = (nums, k) => {
    let count = 0
    if (k < 0) return 0
    if (k === 0) {
        const hash = {}
        for (let num of nums) {
            hash[num] = (hash[num] || 0) + 1
        }
        nums = Object.keys(hash)
        for (let num of nums) {
            if (hash[num] > 1) count++
        }
    } else {
        let numSet = new Set(nums)
        nums = Array.from(numSet)
        for (let num of nums) {
            if (numSet.has(num + k)) {
                count++
                numSet.delete(num + k)
            }

        }
    }
    return count
}

console.log(findPairs([3, 1, 4, 1, 5], 2)) //2
console.log(findPairs([1, 2, 3, 4, 5], 1)) //4
console.log(findPairs([1, 3, 1, 5, 4], 0)) //1
console.log(findPairs([1, 2, 3, 4, 5], -1)) //0
console.log(findPairs([1, 1, 1, 1, 1], 0)) //1
console.log(findPairs([1, 3, 1, 5, 4], 0)) //1
console.log(findPairs([-1, -2, -3], 1)) //2
...