Squeak.ru - шаблоны программирования

Быстрое сравнение последовательных чисел внутри массива и его количество

Как я могу сравнить два последовательных числа в массиве и найти их количество.

let numberArray = [1,2,4,6,7,10,12,13]
// I want to compare two consecutive numbers like [1,2], [4,6], [7,10], [12,13]

Например:
Сначала я хочу вычислить разницу первых двух чисел[1,2(разница=1)]в массиве, затем следующих двух чисел[4,6(разница=2)], затем[ 7,10(difference=3)] и [12,13(difference=1)] наконец.
Наконец, я хочу подсчитать число разности, которое имеет 1. В данном случае количество равно 2.

Какой метод я должен использовать для этого?

Заранее спасибо.

26.11.2018

Ответы:


1

Из этого ответа от Мартин Р, вы можете проверить, как создавать пары, как показано ниже,

let input = [1,2,4,6,7,10,12,13]
let output = stride(from: 0, to: input.count - 1, by: 2).map{(input[$0], input[$0 + 1])}

Теперь вы можете создать массив различий и найти количество единиц, как показано ниже:

let differences = output.map({ $0.1 - $0.0 })
let onesCount = differences.filter({ $0 == 1}).count

print(differences)
print(onesCount)

Вывод

[1, 2, 3, 1]
2
26.11.2018
  • Привет спасибо. это сработало как шарм! это очень просто и легко следовать 26.11.2018

  • 2

    Я уверен, что есть более приятные способы сделать это (но это утро понедельника). Одним из простых решений является перебор массива с использованием шага, что позволяет вам делать шаги с двух. Затем вы добавляете каждую разницу в новый массив различий. И, наконец, используйте фильтр для этого результирующего массива, чтобы определить, как часто возникает эта разница.

    let difference      = 1
    let array           = [1,2,4,6,7,10,12,13]
    var differenceArray = [Int]()
    for index in stride(from: 1, to: array.count, by: 2) {
        let difference  = array[index]-array[index-1]
        differenceArray.append(difference)
    }
    
    print(differenceArray.filter{ $0 == difference }.count)
    
    26.11.2018

    3

    Хороший ответ @Philip. Вот обновленное решение, также обрабатывающее другие случаи.

    let numbers = [1, 2, 5, 4, 10, 6, 7, 8, 11, 10, 23]
    var allDifference: [Int] = []
    for index in stride(from: 0, to: numbers.count, by: 2) {
       let firstValue = numbers[index]
       let secondValue = ((index == numbers.count - 1 && numbers.count % 2 != 0) ? 0 : numbers[index + 1])
       allDifference.append(abs(firstValue - secondValue))
    }
    
    let oneDifferenceCount = allDifference.filter { $0 == 1 }.count
    print("Result: ", oneDifferenceCount)
    
    26.11.2018

    4

    Вы можете добиться этого с помощью 2 строк кода, используя zip compactMap и reduce:

    Сначала мы создаем кортеж последовательных элементов, мы используем zip для использования индекса элемента и compactMap для фильтрации nil элементов, затем мы уменьшаем новый массив, чтобы подсчитывать только кортежи с разницей в 1

    //Create tuples of consecutive values
    let tuples = zip(numberArray.indices, numberArray).compactMap{$0 % 2 == 0 ? nil : (numberArray[$0-1],$1) }
    // reduce to count only the tuples with difference of 1
    let diffOneCount = tuples.reduce(0,{$1.0+1 == $1.1 ? $0+1 : $0})
    
    26.11.2018
    Новые материалы

    Async Await в Swift: легкое управление параллелизмом
    Введение в запуск асинхронного кода Асинхронный код выполняет несколько операций одновременно. Параллелизм необходим при выполнении тяжелых вычислений или сетевых запросов. Однако это может..

    Очистить файлы Program .cache в Ubuntu 20.10
    Очистите кеш за несколько простых шагов! GNU / Linux реализовал эффективное управление хранилищем для своих пользователей. Но заметили ли вы, что в вашей системе Linux заканчивается место,..

    Использование Node.js для чтения действительно больших файлов (часть 1)
    В этом сообщении в блоге есть интересный источник вдохновения. На прошлой неделе кто-то на одном из моих каналов в Slack опубликовал тестовое задание, которое он получил на должность..

    Введение в градиентный спуск и обратное распространение
    Введение в градиентный спуск и обратное распространение Как машинное обучение? Машинное обучение ( ML ) - это исследование компьютерных алгоритмов, которые автоматически улучшаются по..

    Шаблон CQRS — C#
    Этот архитектурный шаблон в основном говорит о том, что мы можем использовать одну модель для операций чтения, а другую — для операций записи. Звучит хорошо, но реализовать его может быть..

    Освоение функций потерь в машинном обучении для регрессии: полное руководство по оптимизации…
    Введение: Функция потерь является важным компонентом алгоритмов машинного обучения и статистических моделей. Его роль заключается в измерении несоответствия между прогнозируемым выходом модели и..

    10 языков программирования, которые изменят мир в 2023 году
    Мир программирования постоянно развивается, и востребованные языки постоянно меняются. Однако есть несколько языков, которые выдержали испытание временем и по-прежнему очень ценны для изучения в..