在输入处,我得到一个作为字符串的多项式,例如“ 7x ^ 4 + 3x ^ 3-6x ^ 2 + x-8” 。我想获取变量中的系数,但是我不知道如何执行此操作。最大程度未知,系数是整数。也可以在某种程度上不使用任何术语。我将非常感谢您的帮助。
我尝试先用“ +”和“-”再用“ x ^”分开,但是我对 x (具有(未书写的)程度1的术语)感到困惑。 我也尝试过先用“ x”分割,再用“ ^”分割,并用“-”处理异常,但是我不知道如何处理缺少度的异常。
private fun koef(text: String) : List<Int> {
val vars = text.split("x")
val koefList = mutableListOf<Int>()
var count = 1
vars.forEach {
if (it == "-") koefList.add(-1)
else {
if (it[0] == '^')
}
}
return koefList
}
答案 0 :(得分:0)
这是一个实现。
这有点笼统,允许术语以任何顺序排列,并带有空白。但是它仍然假设多项式是有效的,幂是非负的并且全都不同,并且至少有一个项。
您没有指定系数的顺序,因此这将以递增的幂形式返回它们(从x ^ 0开始,然后是x ^ 1,&c)。
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 }
}
样本结果:
首先将字符串分割为多个词。 ((?=[+-])
是一个超前行,如果后面跟+
或-
则匹配一个空字符串.Java / Kotlin正则表达式的完整文档为here。)
然后将每个项分解为系数和幂,将它们转换为数字,然后将creates和Map
从项转换为系数。 (这很尴尬,因为它必须处理一些缺少数字和/或符号的特殊情况。)使用?
最后,它找到最大的幂,然后将映射图转换为幂数递增的系数列表,对于缺失的幂填充0。
我将代码简短说明了原理。如果要在生产中使用它,您可能应该使其更安全,更高效,例如通过检查无效输入,例如空字符串,无效字符或重复的权力;并将Regex
放在属性中,这样就不必每次都重新创建它们。某些单元测试也不是一件坏事!