记录一下zj提前批算法一面:
用递归进行数组求和:
算法马上就写出来了,但是运行的时候一直报栈溢出,我以为是我的递归逻辑出问题了,就一直在改,
但是还是报错,最终卡住了… … 开局就GG,自己也慌得一批,导致我第二道题也没做出来。
最初写的代码如下:
/**
* @author guochao
* @date 2022/7/22
*/
public class Main {
public static void main(String[] args) {
int[] nums ={1,2,3};
System.out.println("sum="+getSum(nums, 0));
}
public static int getSum(int[] nums, int i){
if(i >= nums.length) return 0;
int sum = getSum(nums, i++);
int result = nums[i] + sum;
return result;
}
}
结果:
由于面试的时候是白板,无法debug,面试结束后,我自己在idea里面debug,最终才发现了问题!!!
问题出在i++、i+1、++i。
我的代码中写的是i++,但是正确写法是i+1。
经过这次教训,我对于自增的三中写法有了更深刻的认识,相信下一次不会再错了。
i+1:不改变原来i的值,除非强制赋值,比如:i = i + 1;
i++和++i都会改变i的值,但是自增的顺序不同,i++是先使用在自增,++i是先自增再使用。
这里使用是如何定义的呢?我觉得直观来说可以分为两点:
1、直接赋值
eg:a = i++;
2、调用函数的形参赋值
eg:function(++i);
可以看下,下面三个例子:
/**
* @author guochao
* @date 2022/7/22
*/
public class test {
public static void main(String[] args) {
for(int i=0; i<5; i++){
aa(i++); // 注意这行的改变!
}
}
public static void aa(int i){
System.out.print(i + " ");
}
}
/**
* @author guochao
* @date 2022/7/22
*/
public class test {
public static void main(String[] args) {
for(int i=0; i<5; i++){
aa(++i); // 注意这行的改变!
}
}
public static void aa(int i){
System.out.print(i + " ");
}
}
/**
* @author guochao
* @date 2022/7/22
*/
public class test {
public static void main(String[] args) {
for(int i=0; i<5; i++){
aa(i+1); // 注意这行的改变!
}
}
public static void aa(int i){
System.out.print(i + " ");
}
}