Загрузка данных


fun main() {

    val words = Array(30) {
        i -> "Строка ${i + 1}"
    }

    println("Исходный массив:")
    println(words.joinToString())


    val array1 = words.copyOf()

    array1.shuffle()

    println()
    println("Способ 1:")
    println(array1.joinToString())



    val pool = ArrayList<String>()
    val result = ArrayList<String>()

    for (word in words) {
        pool.add(word)
    }

    while (pool.isNotEmpty()) {

        val randomWord = pool.random()

        result.add(randomWord)

        pool.remove(randomWord)
    }

    println()
    println("Способ 2:")
    println(result.joinToString())
}


fun containsNumber(array: ArrayList<Int>, number: Int): Boolean {

    for (item in array) {

        if (item == number) {
            return true
        }
    }

    return false
}


fun main() {

    val array1 = arrayOf(
        5, 3, 8, 1, 2,
        7, 4, 9, 6, 10,
        3, 5, 2, 8, 1
    )

    val array2 = arrayOf(
        15, 12, 11, 14, 13,
        10, 9, 8, 7, 6,
        5, 4, 3, 2, 1
    )



    val result1 = ArrayList<Int>()

    for (number in array1) {

        if (!result1.contains(number)) {
            result1.add(number)
        }
    }

    for (number in array2) {

        if (!result1.contains(number)) {
            result1.add(number)
        }
    }

    result1.sort()

    println("Способ 1:")
    println(result1)



    val result2 = ArrayList<Int>()

    for (number in array1) {

        if (!containsNumber(result2, number)) {
            result2.add(number)
        }
    }

    for (number in array2) {

        if (!containsNumber(result2, number)) {
            result2.add(number)
        }
    }



    for (i in 0 until result2.size - 1) {

        for (j in 0 until result2.size - i - 1) {

            if (result2[j] > result2[j + 1]) {

                val temp = result2[j]

                result2[j] = result2[j + 1]

                result2[j + 1] = temp
            }
        }
    }

    println("Способ 2:")
    println(result2)
}


fun findSubArray(array: Array<Int>, k: Int): Int {

    for (start in array.indices) {

        var sum = 0

        for (end in start until array.size) {

            sum += array[end]

            if (sum == k) {
                return start
            }
        }
    }

    return -1
}


fun main() {

    val array = Array(50) {
        i -> i + 1
    }

    val k = 42

    val index = findSubArray(array, k)

    println("Индекс первого вхождения подмассива = $index")
}


import kotlin.random.Random


fun maxDifferenceBuiltIn(array: Array<Int>): Int {

    var maxDifference = Int.MIN_VALUE

    for (i in 0 until array.size - 1) {

        val rightPart = array.copyOfRange(i + 1, array.size)

        val maxAfter = rightPart.maxOrNull()!!

        val difference = maxAfter - array[i]

        if (difference > maxDifference) {
            maxDifference = difference
        }
    }

    return maxDifference
}


fun maxDifferenceManual(array: Array<Int>): Int {

    var min = array[0]

    var maxDifference = array[1] - array[0]

    for (i in 1 until array.size) {

        val difference = array[i] - min

        if (difference > maxDifference) {
            maxDifference = difference
        }

        if (array[i] < min) {
            min = array[i]
        }
    }

    return maxDifference
}


fun main() {

    val array = Array(100) { Random.nextInt(-100, 101)
    }

    println("Массив:")
    println(array.joinToString())

    println()
    println("Способ 1: ${maxDifferenceBuiltIn(array)}")

    println("Способ 2: ${maxDifferenceManual(array)}")
}


fun countManual(array: Array<Int>, number: Int): Int {

    var count = 0

    for (item in array) {

        if (item == number) {
            count++
        }
    }

    return count
}


fun main() {

    val array = arrayOf(
        3, 7, 2, 7, 3,
        1, 2, 7, 1, 3,
        5, 5, 7, 3, 2,
        1, 5, 7, 3, 2
    )



    val result1 = array.copyOf()

    result1.sortWith(compareByDescending<Int> {
        number -> array.count { it == number } }.thenBy { number -> number }
    )

    println("Способ 1:")
    println(result1.joinToString())


    val result2 = array.copyOf()

    for (i in 0 until result2.size - 1) {

        for (j in 0 until result2.size - i - 1) {

            val first = result2[j]
            val second = result2[j + 1]

            val firstCount = countManual(array, first)

            val secondCount = countManual(array, second)


            if (firstCount < secondCount || firstCount == secondCount && first > second) {

                val temp = result2[j]

                result2[j] = result2[j + 1]

                result2[j + 1] = temp
            }
        }
    }


    println("Способ 2:")
    println(result2.joinToString())
}