力扣练习之加一

我爱海鲸 2022-09-07 15:11:55 初级算法

简介初级算法

原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2cv1c/

解法一:

 public static int[] plusOne(int[] digits) {
        int max = 15;

        int length = digits.length;

        int d = length/max + (length%max != 0 ? 1 : 0);

        String[] strs = new String[d];

        for (int i = 0; i < d; i++) {
            StringBuilder vStr = new StringBuilder();
            for (int j = i*max; j < digits.length && j < (i+1)*max; j++) {
                vStr.append(digits[j]);
            }
            strs[i] = vStr.toString();
        }

        int x = 1;
        for (int i = strs.length-1; i >= 0; i--) {
            boolean flag = strs[i].startsWith("0");
            if (flag) {
                int zero = 0;
                String sTemp = strs[i].substring(1);
                while(sTemp.startsWith("0")) {
                    sTemp = sTemp.substring(1);
                    zero++;
                }
                long vInt = Long.parseLong(strs[i]);
                vInt = vInt + x;
                String s = vInt+"";
                if (s.length() == strs[i].length() ) {
                    x = 1;
                    strs[i] = s;
                } else {
                    for (int i1 = 0; i1 < zero; i1++) {
                        s = "0" + s;
                    }
                    strs[i] = "0" + s;
                    x = 0;
                }
            } else {
                long vInt = Long.parseLong(strs[i]);
                vInt = vInt + x;
                x = 0;
                String s = vInt+"";
                if (i != 0 && s.length() != strs[i].length()) {
                    x++;
                    strs[i] = s.substring(1);
                } else {
                    strs[i] = s;
                }
            }

        }

        int clength = 0;
        StringBuilder resultStr = new StringBuilder();
        for (int i = 0; i < strs.length; i++) {
            clength = clength + strs[i].length();
            resultStr.append(strs[i]);
        }
        char[] chars = resultStr.toString().toCharArray();
        int[] result = new int[clength];
        for (int i = 0; i < chars.length; i++) {
            result[i] =  (int)chars[i] - (int)('0');
        }
        return result;
    }

思路:这种方法是一个不是很推荐的方法,在看到这个题的时候,心想这个题怎么这么简单,不就是在原来的数值上加一么?它的用例说明也不是特别的好!

但是跑一下用例就会知道,这个题其实考察的就是一个进位的问题,我的想法是将数组的值拼接起来,通过number类型的值进行强转,然后加一,最后在转换为数组,完事!!!

看,想法是不是特别好,也特别天真,问题来了,当输入的数组长度非常大的时候,number类型就会强转失败,那么,怎么解决这个问题呢,我的做法就是将一个比较长的数组分为好几段,在进行运算。

但是这样还是有问题。问题就是如果分出来的字符串开头为0,那么就会出现丢位问题,所以这里要做判断,而且判断还要进行连续,因为可能连续出现0。最后将没一个分段的结果进行结合,最后的结果就是我们需要的值。

解法二:

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

思路:数组从后开始遍历,若数组元素不是9则加一直接返回,否则将当前元素设置为0,数组遍历结束后,还要最后判断一个特殊值,如果数组元素都为9,那么遍历出来的结果就会变为0...0,所以需要添加一个临时的变量,长度为原来数组长度加一,第一个元素为1即可。

你好:我的2025