leetcode每日一题-加1

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

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

1 <= digits.length <= 100
0 <= digits[i] <= 9


解题思路

  1. java大数。暴力办法解题。把数组转换为字符串后,加成数字,比如 [1,2,3] 转换为123,然后加一,注意数组长度最大为100,而java处理8位以上普通int类型会直接溢出。故使用java大数类BigInteger。暴力直接加一即可。此算法优点简单,缺点算法比较呆。。。。
    算法:
  if (digits[0]==0){
            digits[0]=1;
            return digits;
        }else {
            BigInteger sum = new BigInteger("1");
            BigInteger shi = new BigInteger("10");
            for (int i = 0; i < digits.length; i++) {
                BigInteger num=shi.pow(digits.length-i-1);
                BigInteger a=num.multiply(BigInteger.valueOf(digits[i]));
                sum=sum.add(a);
            }
            String str=String.valueOf(sum);
            int arr[]=new int[str.length()];
            for (int i = 0; i < str.length(); i++) {
                Character ch=str.charAt(i);
                arr[i]=Integer.parseInt(ch.toString());
            }
            return arr;
        }
  1. 另一思路。加一有两种情况:
  • 除如99,999等 之外的数字加一;
  • 数字 99。加一得十,进一位后数组长度直接延长一。
    算法:
for (int i = digits.length-1; i >=0 ; i--) {
      digits[i]++;
     digits[i]=digits[i]%10; //小于10的数字模10还是原数
     if (digits[i]!=0){
     	return digits;//直接退出循环
     }
}
digits=new int[digits.length+1];//数组延长一位
digits[0]=1;//第一位直接为0
return digits;

原题地址:https://leetcode-cn.com/problems/plus-one/

上一篇:2021-07-14


下一篇:牛客网-第一场-J-Fraction Comparision