k****r 发帖数: 807 | 1 这道题当时c++时简单的就实现了,但是类似的,我用java就不对,具体代码是这样的
public class Solution {
public int sumNumbers(TreeNode root) {
int result = 0;
int tmp = 0;
sumHelp(root, tmp, result);
return result;
}
private void sumHelp(TreeNode root, int tmp, int sum){
if (root == null) return;
if (root.left == null && root.right == null){
int newone = tmp + root.val;
sum = sum + newone;
}
if (root.right != null) sumHelp(root.right, (tmp + root.val)*10, sum
);
if (root.left != null) sumHelp(root.left, (tmp + root.val)*10, sum);
return;
}
}
但为什么这样就对呢:
public class Solution {
public int sumNumbers(TreeNode root) {
int result = 0;
return sumHelp(root, result);
}
private int sumHelp(TreeNode root, int sum){
if (root == null) return 0;
int res = sum*10 + root.val;
if (root.left == null && root.right == null){
return res;
}
return (sumHelp(root.left, res) + sumHelp(root.right, res));
}
} |
b******g 发帖数: 3616 | 2 完全不懂java的人表示第一段code貌似是按C++的写法把返回结果放在输入参数的sum里
?但是似乎听说java是pass-by-value。。。。 |
z*******3 发帖数: 13709 | 3 建议把java教材看一遍,java没有那么难,但是也没有那么简单
尤其是对于c++转行的程序员来说,c那种控制内存的习惯还会增加难度
这题楼上说得差不多,java里面所有的基础类型
在作为方法参数传入的时候,是值拷贝
而不是拷贝地址,因为你传的不是对象
所以拷贝的就是value,而不是reference
所以return必需返回一个value,然后赋值给另外一个变量
要理解这个,把stack&heap好好看看
其实拷贝的都是stack里面的value
只不过primitive type在stack里面存的是value
而一般对象存的是reference |
k****r 发帖数: 807 | 4 谢谢ls的回复,我确实应该再好好看看java书。
by value,
所以说,第一段代码里的 sum = sum + newone;就不可会把改变了的sum值带到调用这
次recursion之外了吗?
如果是这样,我记得之前自己写了一个List>为入参的一个例子,好像
用的 add()可以带出来,不知道怎么回事。 |
z*******3 发帖数: 13709 | 5 list是对象,存的是reference
你这里sum是primitive type
【在 k****r 的大作中提到】 : 谢谢ls的回复,我确实应该再好好看看java书。 : by value, : 所以说,第一段代码里的 sum = sum + newone;就不可会把改变了的sum值带到调用这 : 次recursion之外了吗? : 如果是这样,我记得之前自己写了一个List>为入参的一个例子,好像 : 用的 add()可以带出来,不知道怎么回事。
|
k****r 发帖数: 807 | 6 哦了,原来primitive type和对象有这样的区别啊,学习了,谢谢。
【在 z*******3 的大作中提到】 : list是对象,存的是reference : 你这里sum是primitive type
|
n*****n 发帖数: 5277 | |
w********1 发帖数: 3 | 8 java primitive type传的是值的copy,其他java object type传的是引用的copy |