как использовать вложенные циклы for в котлин?
как использовать, вложенные циклы for в котлин, по котлину мало информации в интернете и на англоязычных сайтах, я студентка пытаюсь решать задачи leetCode , когда смотрю там там другие решают задачи с помощью двойных циклов я вообще не могу понять как работает двойные циклы, опытные товарищи поделитесь пожалуйста с знанием. вот пример двойных циклов но как они работают не пойму.
еще внутри цикла прибавлять отнимать можно?
fun twoSum(nums: IntArray, target: Int): IntArray {
val nums = arrayOf(2,7,11,15)
for (i in nums.indices) {
for (j in i + 1 until nums.size) {
if (nums[j] == target - nums[i]) {
return intArrayOf(i, j)
}
}
}
throw IllegalArgumentException("No two sum solution")
}
Ответы (2 шт):
fun twoSum(nums: IntArray, target: Int): IntArray {
val nums = arrayOf(2, 7, 11, 15);
// nums.indices -> генерирует массив индексов [0, 1, 2, 3]
// i итерируется по этому массиву 0, 1, 2, 3
for (i in nums.indices) {
// i + 1 until nums.size -> создаёт диапазон (IntRange) от i+1 до размера nums
// nums.size = 4 (4 элемента в массиве)
// until -> создаёт диапазон, который не включает последнее значение
// диапазон будет следующим [i + 1, i + 2, ... nums.size) (если конечно i всё ещё меньше nums.size)
for (j in i + 1 until nums.size) {
// cравниваем nums[j] с target - nums[i]
if (nums[j] == target - nums[i]) {
return intArrayOf(i, j);
}
}
}
throw IllegalArgumentException("No two sum solution")
}
Как этот алгоритм примерно выглядит:
- Итерация i = 0
- Итерация j = 1
- Сравниваем nums[1] == target - nums[0]
- Сравниваем 7 == target - 2
- Если условие сработало, то выход: возвращаем массив индексов [0, 1]
- Итерация j = 2
- Сравниваем nums[2] == target - nums[0]
- Сравниваем 11 == target - 2
- Если условие сработало, то выход: возвращаем массив индексов [0, 2]
- Итерация j = 3
- Сравниваем nums[3] == target - nums[0]
- Сравниваем 15 == target - 2
- Если условие сработало, то выход: возвращаем массив индексов [0, 3]
- Итерация j = 1
- Итерация i = 1
- Итерация j = 2
- Сравниваем nums[2] == target - nums[1]
- Сравниваем 11 == target - 7
- Если условие сработало, то выход: возвращаем массив индексов [1, 2]
- Итерация j = 3
- Сравниваем nums[3] == target - nums[1]
- Сравниваем 15 == target - 7
- Если условие сработало, то выход: возвращаем массив индексов [1, 3]
- Итерация j = 2
- Итерация i = 2
- Итерация j = 3
- Сравниваем nums[3] == target - nums[2]
- Сравниваем 15 == target - 11
- Если условие сработало, то выход: возвращаем массив индексов [2, 3]
- Итерация j = 3
Прежде, чем запустить код, попробуем его прочитать и интерпретировать с помощью мысли:
Итак, есть массив размером 4:
val nums = arrayOf(2, 7, 11, 15);
Теперь посмотрим на этот цикл в цикле:
for (i in 0..3) {
for (j in i..3) {
// код
}
}
- Заходим во внешний цикл, i = 0, запускаем внутренний цикл, j меняется от 0 до 3
- Следующий шаг внешнего цикла, i = 1, запускаем внутренний цикл, j меняется от 1 до 3
- Следующий шаг внешнего цикла, i = 2, запускаем внутренний цикл, j меняется от 2 до 3
- Следующий шаг внешнего цикла, i = 3, запускаем внутренний цикл, j меняется от 3 до 3
- Цикл завершается, так как дошли до последнего индекса 3.
А теперь запустим код, распечатаем i и j таким образом:
for (i in 0..3) {
println("i = $i")
for (j in i..3) {
println(" j = $j")
}
}
На выходе получаем:
i = 0
j = 0
j = 1
j = 2
j = 3
i = 1
j = 1
j = 2
j = 3
i = 2
j = 2
j = 3
i = 3
j = 3