leetcode-66-加一(PLUS one)-java

题目及测试

package pid66;
/*加一

给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。

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

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

示例 1:

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

示例 2:

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


}*/
public class main {

    public static void main(String[] args) {
        int[][] testTable = {{1,2,3},{4,3,2,1},{1,2,3,9},{1,1,9,9},{9,9}};
        for (int[] ito : testTable) {
            test(ito);
        }
    }

    private static void test(int[] ito) {
        Solution solution = new Solution();
        int[] rtn;
        long begin = System.currentTimeMillis();
        for (int i = 0; i < ito.length; i++) {
            System.out.print(ito[i]+" ");
        }//开始时打印数组
        rtn = solution.plusOne(ito);//执行程序
        long end = System.currentTimeMillis();      
        System.out.println("rtn=" );
        for (int i = 0; i < rtn.length; i++) {
            System.out.print(rtn[i]+" ");
        }//打印结果几数组
        System.out.println();
        System.out.println("耗时:" + (end - begin) + "ms");
        System.out.println("-------------------");
    }

}

解法1(成功,0ms,很快)
对每位循环
如果为9,则变为0,继续下一次循环
不为9,则+1,退出循环
最后如果进行到最后的循环,并且第一个数为0,则证明原数为999型
新建一个1000型的数组并返回。

package pid66;

public class Solution {
     public int[] plusOne(int[] digits) {
         int length=digits.length;
         int i;
         for(i=length-1;i>=0;i--){
             int now=digits[i];
             if(now==9){
                 digits[i]=0;
             }
             else{
                 digits[i]=now+1;
                 break;
             }
         }

         if(i==-1&&digits[0]==0){
             int[] newResult=new int[length+1];
             newResult[0]=1;
             for(i=1;i<length+1;i++){
                 newResult[i]=0;
             }
             return newResult;
         }
         else{
             return digits;
         }

        }

}

解法2(别人的,成功,0ms,很快)
思路与解法1基本相同,判断进位用mod10,创造新数组用copyarray

 public int[] plusOne(int[] digits) {

        int carry = 1; // 进位标志,下一位来的进位标志
        int tmp;
        for (int i = digits.length - 1; i >= 0; i--) {
            tmp = digits[i];
            digits[i] = (tmp + carry) % 10; // 计算当前位的新值
            carry = (tmp + carry) / 10; // 计算新的进位

            if (carry == 0) { // 没有进位了就可以退出了
                break;
            }
        }

        if (carry == 1) { // 最后还有一个进位
            int[] result = new int[digits.length + 1];
            System.arraycopy(digits, 0, result, 1, digits.length);
            result[0] = carry;;
            return result;
        } else {
            return digits;
        }
    }

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/81429577