Это довольно забавное домашнее задание, которое у вас есть :)
Первым делом ответ здесь:
val allItems = (1..100).toList()
val ranges = listOf(5..10, 15..20, 80..90).sortedBy { it.first }
val removedRanges = allItems - (ranges.map { it.toList() }.reduce { a, b-> a + b })
val result = removedRanges
.mapIndexed { i, it -> it to i }
.groupBy { it.first - it.second }
.map { it.value.map { it.first } }
.map { it.first() .. it.last() }
Log.w("here are your ranges", result.joinToString { "$it" })
Давайте сначала поговорим о том, как работает этот относительно короткий код, это ни в коем случаеидеальное решение, но оно позволяет вам работать с «списком» вместо диапазонов для начального списка.
removeRanges
В kotlin мы можем изменить диапазон на список со всеми его элементами простым методом .toList() и мы можем сделать простую математику с такими списками, иначе listOf (1,2,3) + listOf (5) приведет к [1,2,3,5]. Операция Reduce позволяет вам преобразовать набор T в один элемент T, выполнив операцию, в этом случае мы просто хотим суммировать все диапазоны и удалить их из начального набора, таким образом, removeRanges будет [1, 2, 3, 4, 11,12, ...
result
Идея здесь довольно проста, как обнаружить непрерывные диапазоны с помощью списка целых чисел? Мы группируем их по разнице между их индексом и их значением. Наконец, отобразите их в список и, наконец, вернитесь к диапазонам.
Приветствия и веселье. К сожалению, даже при правильном ответе учитель может спросить вас, как вы пришли к этой идее :) ...