在LeetCode上写算法发现一个递归导致的栈溢出问题

今天在力扣上写一道算法题的时候发现一个关于栈溢出的问题(就是深度层次太多导致抛出了异常)

给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:

输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/plus-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的解题:我是通过进1就递归调用的方法去实现该算法,虽然说确实能够实现,但是缺存在一个栈溢出的风险,如果数组够大,就会抛出异常:

我的算法:

    public static int[] plusOne2(int[] digits) {
       int start=digits.length-1;
       return method(digits,start);
       
    }

    public static int[] method(int[] digits,int index){
        int a=digits[index]+1;
          if(a!=10){
            digits[index]=a;
            while(index<digits.length-1){
                digits[index+1]=0;
                index++;
            }
            return digits;
          }else{
              if(index==0){
                   digits=new int[digits.length+1];
                   digits[0]=1;
                   return digits;
              }else{
                  return method(digits,index-1);
              }
            
          }
        
        
    }

 

测试:

结果:

StackOverflowError代表的是,当栈深度超过虚拟机分配给线程的栈大小时就会出现此error,所以说递归不是想用就用的,还得好好考虑好深度问题,当我设置数组一万就可以运行,但是设置5万就抛出异常了。

我们再看下精选的算法:看着简单但是其实里面很是灵活

    public int[] plusOne(int[] digits) {
        for (int i = digits.length - 1; i >= 0; i--) {
            digits[i]++;
            digits[i] = digits[i] % 10;
            if (digits[i] != 0) return digits;
        }
        digits = new int[digits.length + 1];
        digits[0] = 1;
        return digits;
    }

作者:yhhzw
链接:https://leetcode-cn.com/problems/plus-one/solution/java-shu-xue-jie-ti-by-yhhzw/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

同时我也进行了该算法的测试发现并设置了超过500000000的数组长度,没有抛出异常,直到内存溢出也没有抛出其他异常。

总结:当我们想要使用递归算法的时候得多考虑一个点:当数据量足够大,是否会导致抛出StackOverflowError异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值