Kotlin循环内无法重新赋值变量原因求解(数字转罗马数字场景)
代码问题点
- 变量未正确赋值:Kotlin 中
+属于纯运算操作,只会生成新的结果值,不会修改原变量。你代码里的romanNumeral + "I"、numberBeingChecked - 1都只是临时计算了结果,没有赋值回原变量,所以两个变量的值始终不会发生变化。需要改为赋值写法:字符串拼接用romanNumeral += "I"(等价于romanNumeral = romanNumeral + "I"),数值递减用numberBeingChecked -= 1即可。 - 循环被提前终止:每个when分支末尾都加了
break@myLoop,会导致循环仅执行一次就直接跳出,哪怕numberBeingChecked还大于0,剩余的数值根本没有处理,需要删除所有when分支中的break@myLoop语句。 - 特殊罗马数字规则缺失:现有逻辑只能实现基础字符拼接,无法处理4(IV)、9(IX)、40(XL)、90(XC)、400(CD)、900(CM)这类特殊组合的规则,最终输出结果会不符合罗马数字规范,需要补充对应优先级更高的判断分支。
修正后完整代码
fun encode(num: Int): String { var numberBeingChecked: Int = num var romanNumeral: String = "" // 按从大到小排序的罗马数字映射,包含特殊规则 val romanMap = listOf( 1000 to "M", 900 to "CM", 500 to "D", 400 to "CD", 100 to "C", 90 to "XC", 50 to "L", 40 to "XL", 10 to "X", 9 to "IX", 5 to "V", 4 to "IV", 1 to "I" ) for ((value, symbol) in romanMap) { while (numberBeingChecked >= value) { romanNumeral += symbol numberBeingChecked -= value } if (numberBeingChecked == 0) break } return romanNumeral } fun main(args: Array<String>) { println(encode(0)) // 输出空字符串 println(encode(1)) // 输出 I println(encode(21)) // 输出 XXI println(encode(2008)) // 输出 MMVIII println(encode(1666)) // 输出 MDCLXVI }
内容的提问来源于stack exchange,提问作者Sarbraj Dulai
相关产品推荐
相关产品推荐

