Kotlin报val cannot be reassigned错误时如何修改整型变量
针对你在求解LeetCode题目《根到叶子节点数字之和》时遇到的编译报错,原因和修复方案如下:
错误原因
Kotlin变量声明有明确的可变性约束:
val声明的是只读变量,赋值后不可重新修改,等价于Java的final修饰变量var声明的是可变变量,初始化后可重复赋值
你的代码中将累计结果的变量res声明为val,后续循环中尝试重新给res赋值,直接触发了编译报错。
修复方法
最小改动版本
仅需将res的声明关键字从val改为var即可解决编译问题,调整后的核心代码段如下:
if (root == null) { return 0 } val pair: Pair<String, TreeNode> = Pair(root.`val`.toString(), root) val queue = mutableListOf(pair) // 原val res = 0 修改为var声明 var res = 0 while (queue.isNotEmpty()) { val pair = queue.removeAt(0) val (path, node) = pair if (node.left == null && node.right == null) { // Kotlin支持+=运算符,比res.plus()更简洁,行尾分号可省略 res += path.toInt() continue } if (node.left != null) { val tmp = path + node.left.`val` queue.add(Pair(tmp, node.left)) } if (node.right != null) { val tmp = path + node.right.`val` queue.add(Pair(tmp, node.right)) } } return res
性能优化版本
原实现用字符串拼接路径再转整数,存在不必要的对象创建和类型转换开销,可以直接在队列中存储当前节点和累计的数字和,不需要字符串中转,代码更简洁性能也更好:
/** * Example: * var ti = TreeNode(5) * var v = ti.`val` * Definition for a binary tree node. * class TreeNode(var `val`: Int) { * var left: TreeNode? = null * var right: TreeNode? = null * } */ class Solution { fun sumNumbers(root: TreeNode?): Int { // 空节点直接返回0 root ?: return 0 val queue = mutableListOf(Pair(root, root.`val`)) var total = 0 while (queue.isNotEmpty()) { val (currentNode, currentSum) = queue.removeAt(0) // 遇到叶子节点,累计和加入结果 if (currentNode.left == null && currentNode.right == null) { total += currentSum continue } // 左子节点非空时入队,累计值 = 上层值*10 + 当前节点值 currentNode.left?.let { queue.add(Pair(it, currentSum * 10 + it.`val`)) } // 右子节点非空时入队 currentNode.right?.let { queue.add(Pair(it, currentSum * 10 + it.`val`)) } } return total } }
优化点说明:
- 用
?:空判断运算符简化根节点为空的边界逻辑 - 全程用整数计算,避免字符串操作的额外开销
- 用
?.let安全调用简化子节点的非空判断,减少冗余代码 - 移除了Kotlin中非必须的行尾分号,符合官方编码规范
内容的提问来源于stack exchange,提问作者explorer
相关产品推荐
相关产品推荐

