• leetCode 加一 问题记录


    给定一个非负整数组成的非空数组,在该数的基础上加一,返回一个新的数组。
    
    最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
    
    你可以假设除了整数 0 之外,这个整数不会以零开头。
    
    示例 1:
    
    输入: [1,2,3]
    输出: [1,2,4]
    解释: 输入数组表示数字 123。
    示例 2:
    
    输入: [4,3,2,1]
    输出: [4,3,2,2]
    解释: 输入数组表示数字 4321。

    自己的做法

    String arrayStr = Arrays.toString(digits);
            arrayStr = arrayStr.replaceAll("[\[\],\s]","");
    //        String arrayStr = StringUtils.join(Arrays.asList(digits),"");
            BigInteger num = new BigInteger(arrayStr);
            num = num.add(BigInteger.ONE);
            int[] resultArray = new int[num.toString().length()];
            char[] charArray = num.toString().toCharArray();
            for (int i = 0;i<charArray.length;i++){
                resultArray[i] = Integer.parseInt(String.valueOf(charArray[i]));
            }
            return resultArray;

    结果说BigInteger不让用,因为输入数组可能是无限大的  基础的int long都不能满足要求。后来只好改成下面这种

    Boolean addFlag = true;
    int[] result = new int[digits.length+1];
    for (int i = digits.length-1;i>=0;i--){
    Integer num = digits[i];
    if (addFlag){
    if (num >= 9){
    num++;
    num = num%10;
    }else {
    num++;
    addFlag = false;
    }
    }else {
    addFlag = false;

    }
    result[i+1] = num;
    }
    if (addFlag){
    result[0] = 1;
    return result;
    }else {
    return Arrays.copyOfRange(result,1,result.length);
    }
    
    

    思路就是新建一个比原数组长一个单位的数组,从尾部开始办理数组的每一位判断是否需要进1,并进行加1,放到新数组的i+1的位置,最后判断原数组第一位是否需要进1 如果需要则为新数组第一位设置为1,并返回。如果不需要则截取从第一位开始的整个数组返回。

    leetcode上的最优解示例

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

    原理跟我的思路差不多,区别在于我是用单独一个标志来存储是否需要进1,num是通过++来加值。最优解通过一个int的变量既能当做进1的标志也能参与计算出+1后的temp。

  • 相关阅读:
    CStringArray序列化处理
    【转】C++ Incorrect Memory Usage and Corrupted Memory(模拟C++程序内存使用崩溃问题)
    【转】Native Thread for Win32 C- Creating Processes(通俗易懂,非常好)
    【转】Native Thread for Win32 B-Threads Synchronization(通俗易懂,非常好)
    【转】Native Thread for Win32 A- Create Thread(通俗易懂,非常好)
    【转】关于OnPaint的工作机制
    Window发声函数Beep、MessageBeep
    Sqlite
    VC++ Splash Window封装类CSplash
    通过代码注册COM、DLL组件
  • 原文地址:https://www.cnblogs.com/beliveli/p/9016614.html
Copyright © 2020-2023  润新知