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
) {}
Это буквально один из самых распространенных вопросов интервью.
Ваше текущее решение имеет временную сложность 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) Если во входном массиве более одной действительной пары, возвращающей только одну действительную пару, то все в порядке.
Поскольку вы заботитесь только об одной паре индексов, у которых сумма элемента равна определенному числу, используйте 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)
}
(Я просто понимаю, что это НЕ верно. Поэтому, пожалуйста, пропустите это решение :() Здесь есть 2 комментария.
number = -2
и list = listOf(-1)
. Тогда [113 ] не может сказать нам, доступна ли эта пара в out list
. Другое дело, что Kotlin предоставляет нулевую функцию безопасности. Мы можем вернуть ее как обнуляемый тип, в данном случае, Pair<Int, Int>?
. Если наша функция возвращает нулевое значение, это означает, что что нет никакой возможной пары, которую мы ищем явно. 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 ]