码迷,mamicode.com
首页 > 编程语言 > 详细

LeetCode——66. 加一(Java)

时间:2021-03-01 13:41:38      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:精选   循环结构   算法   builder   源码   solution   表示   组成   turn   

题目介绍

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

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

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

示例3:
输入:digits = [0]
输出:[1]

题解思路

首先题目中要注意的是加一和单个数字这两个点,但是很多没有想到的点还是让我踩了很多坑

首先是他不仅仅是得到的数组是单个位置的,它提供的数组也是单个数组存放的

所以你只需要再最后一项元素上加一,然后用StringBulider的append()方法得到一个完整的StringBulider再分割就可以了

注意用CharAt()方法得到的是Char类型,需要用Integer类的parseInt转成int类型存放到新数组里

但是在我以为很简单的时候,我还是忽略了一个重要的测试用例[9,9],他的答案可不是[9,1,0],而是[1,0,0]

没错,这个加一是往前递进的,不仅仅是加在最后一位,自己的理解力每次都让我失望,所以这就要在第一步加一处做修改

考虑到这种情况,原数组就不可以用了,因为肯定存在溢出的位,所以要声明新数组重新存储

用自己的方法坐下来,新声明了两个数组,三个循环结构,复杂度不用想就糟糕了,击败了5%的用户。。。。。

官方这次也没题解,不过看精选的做法确实让我钦佩,十分简洁,其实理解一样,但是人家的做法确实精炼,一起来看看

正确代码

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

//也把自己臃肿的代码拿出来比较一下,看看差距
public static int[] plusOne(int[] digits) {
        digits[digits.length - 1] += 1;

        int[] digits1 = new int[digits.length + 1];

        for (int i = 1; i < digits1.length; i++) {
            digits1[i] = digits[i - 1];
        }
        for (int i = digits1.length - 1; i > 0; i--) {
            if (digits1[i] == 10) {
                digits1[i] = 0;
                digits1[i - 1] += 1;
            }
        }

        //System.out.println(Arrays.toString(digits1));

        StringBuilder stringBuilder = new StringBuilder();

        //转换为String类型
        for (int i = 0; i < digits1.length; i++) {
            if (i == 0 && digits1[0] == 0) {
                continue;
            }
            stringBuilder.append(digits1[i]);
        }

//        System.out.println(stringBuilder);
//        System.out.println(stringBuilder.length());

        //新数组按照单个数字存储
        int[] ints = new int[stringBuilder.length()];
        for (int i = 0; i < stringBuilder.length(); i++) {
            //将char类型转化为Int
            ints[i] = Integer.parseInt(String.valueOf(stringBuilder.charAt(i)));
        }

        return ints;
    }


总结

算法题是要一直刷的,有些问题你需要理解和自己动手实践,否则有些隐藏的条件是看不出来的

其实作为菜鸟,能用自己的方法做出来其实就已经是一件很欣慰的事情了

这道算法题没有其他重要的算法思想,就是理清思路,先想明白在写代码,这是一个好程序员都有的习惯,手撸源码的大神除外(狗头保命)

文章如果存在问题或者有更好的题解,希望大佬斧正和评论,各自努力,你我最高处见

LeetCode——66. 加一(Java)

标签:精选   循环结构   算法   builder   源码   solution   表示   组成   turn   

原文地址:https://www.cnblogs.com/bc-song/p/14458674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!