Как суммировать элементы списка каждый с каждым?

if ((state.staff.members && state.staff.members.length < 5) || (state.staff.departments && state.staff.departments.length < 5)) {}

Предполагается, что вы хотите, чтобы условие проходило только тогда, когда установлено хотя бы одно из свойств.

Изменить: в ответ на ваш комментарий я тогда напишу его следующим образом

if ((state.staff.members && state.staff.members.length < 5) 
    || (state.staff.departments && state.staff.departments.length < 5)
    || state.staff.hasOwnProperty('members') === false
    || state.staff.hasOwnProperty('departments') === false
) {}
-1
задан A.Rost 19 January 2019 в 09:13
поделиться

3 ответа

Это буквально один из самых распространенных вопросов интервью.

Ваше текущее решение имеет временную сложность O (N ^ 2) , что не хорошо, однако оно имеет пространственную сложность O (1) , которая равна хорошо.

Вот рабочая версия этого подхода:

fun findSumOfTwo(arr: IntArray, targetSum: Int): Pair<Int, Int> {
    if (arr.size < 2) return Pair(-1, -1)
    var sum: Int
    for (i in 0..arr.size - 2) {
        for (j in i + 1..arr.size - 1) {
            sum = arr[i] + arr[j]
            if (sum == targetSum)  {
                if (arr[i] < arr[j]) {
                    return Pair(i, j)
                }
                return Pair(j, i)
            }
        }
    }
    return Pair(-1, -1)
}

После кодирования чего-то похожего на вышеизложенное ваш интервьюер, скорее всего, попросит вас оптимизировать сложность времени до O (N) , (пространственная сложность должна увеличиться до O (N) , но это нормально, временная сложность более важна в большинстве случаев).

Вы можете сделать это, используя один проход, используя HashMap :

fun findSumOfTwo(arr: IntArray, targetSum: Int): Pair<Int, Int> {
    if (arr.size < 2) return Pair(-1, -1)
    var map = HashMap<Int, Int>()
    for (i in 0..arr.size - 1) {
        var complement = targetSum - arr[i]
        if (map.containsKey(complement)) {
            var complementIndex = map.get(complement)!!
            if (arr[i] < complement) {
                return Pair(i, complementIndex)
            }
            return Pair(complementIndex, i)
        }
        map.put(arr[i], i)
    }
    return Pair(-1, -1)
}

Примечание. Эти два решения дают два предположения: 1) входной массив не отсортирован. 2) Если во входном массиве более одной действительной пары, возвращающей только одну действительную пару, то все в порядке.

0
ответ дан shash678 19 January 2019 в 09:13
поделиться

Поскольку вы заботитесь только об одной паре индексов, у которых сумма элемента равна определенному числу, используйте forEachIndexed :

fun findSumOfTwo(list: List<Int>, number: Int): Pair<Int, Int> {

   list.forEachIndexed { i1, e1 ->
        list.forEachIndexed { i2, e2 ->
            if(e1 + e2 == number) {
                return i1 to i2
            }
        }
    }

    return Pair (-1, -1)
}
0
ответ дан Willi Mentzel 19 January 2019 в 09:13
поделиться

(Я просто понимаю, что это НЕ верно. Поэтому, пожалуйста, пропустите это решение :() Здесь есть 2 комментария.

  1. Представьте себе, если number = -2 и list = listOf(-1). Тогда [113 ] не может сказать нам, доступна ли эта пара в out list. Другое дело, что Kotlin предоставляет нулевую функцию безопасности. Мы можем вернуть ее как обнуляемый тип, в данном случае, Pair<Int, Int>?. Если наша функция возвращает нулевое значение, это означает, что что нет никакой возможной пары, которую мы ищем явно.
  2. Мое альтернативное решение приходит с концепцией функционального программирования.
fun findSumOfTwo(list: List<Int>, number: Int): Pair<Int, Int>? {
    return list
            .flatMap { it1 -> list.map { it2 -> Pair(it1, it2) } }
            .firstOrNull { it.first + it.second == number }
}

Не стесняйтесь обсуждать:) [1110 ]

0
ответ дан MyrmidonXIIV 19 January 2019 в 09:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: