как использовать вложенные циклы 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 шт):

Автор решения: Komdosh
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]
  • Итерация 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]
  • Итерация i = 2
    • Итерация j = 3
      • Сравниваем nums[3] == target - nums[2]
      • Сравниваем 15 == target - 11
      • Если условие сработало, то выход: возвращаем массив индексов [2, 3]
→ Ссылка
Автор решения: Vadik

Прежде, чем запустить код, попробуем его прочитать и интерпретировать с помощью мысли:

Итак, есть массив размером 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
→ Ссылка