Вот одна из реализаций.
Это несколько более общий термин, позволяющий использовать термины в любом порядке и иметь окружающие пробелы.Но он по-прежнему предполагает, что многочлен действителен, что степени неотрицательны и все различны, и что есть хотя бы один член.
Вы не указали порядок коэффициентов, поэтому он возвращает их вувеличение мощности (начиная с x ^ 0, затем x ^ 1 и т. д.).
private fun coeffs(polynomial: String): List<Int> {
val terms = polynomial.split(Regex("(?=[+-])")).associate{ term ->
val s = term.split(Regex("x\\^?"))
val coeff = s[0].replace(" ", "")
.let{ when (it){ "", "+" -> 1; "-" -> -1; else -> it.toInt() }}
val power = s.getOrNull(1)?.trim()
.let{ when (it){ null -> 0; "" -> 1; else -> it.toInt() }}
power to coeff
}
val highestPower = terms.keys.max()!!
return (0..highestPower).map{ terms[it] ?: 0 }
}
Примеры результатов:
- coeffs ("x ^ 2 + 2x-1") = [-1, 2, 1]
- коэф. (" 2x ^ 3 - 3x ^ 4 - x + 4 ") = [4, -1, 0, 2, -3]
- coeffs ("x") = [0, 1]
- coeffs ("- 2") = [-2]
Он начинается с разбиения строки на термины,((?=[+-])
- это запрос, который соответствует пустой строке, если за ней следует +
или -
. Полная документация по регулярным выражениям Java / Kotlin: здесь .)
Itзатем разбивает каждый член на коэффициент и степень, преобразует их в числа и создает a Map
от члена к коэффициенту.(Это довольно неловко, поскольку приходится обрабатывать несколько особых случаев, когда числа и / или знаки отсутствуют.) Использование карты обрабатывает недостающие способности (а также силы, которые не в порядке).
Наконец,он находит наибольшую мощность и преобразует карту в список коэффициентов с возрастающей степенью, заполняя 0 для отсутствующих степеней.
Я сохранил короткий код, чтобы показать принцип.Если он будет использоваться в производстве, вы, вероятно, должны сделать его более безопасным и более эффективным, например, путем проверки на недопустимый ввод, такой как пустая строка, недопустимые символы или дублирующиеся полномочия;и помещая Regex
в свойства, чтобы их не нужно было каждый раз воссоздавать.Некоторые юнит-тесты тоже не будут плохими!