• LeetCode算法题-Plus One(Java实现)


    这是悦乐书的第156次更新,第158篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第15题(顺位题号是66)。给定一个非空数字数组来表示一个非负整数,并给其加1。该数组已经排序,并且最高位有效数字位于数组的开头,并且数组中的每个元素都表示单个数字。假设该整数不以零开头,除了数字0本身。例如:

    输入:[1,2,3]
    输出:[1,2,4]
    说明:数组表示整数123

    输入:[4,3,2,1]
    输出:[4,3,2,2]
    说明:数组表示整数4321

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 分析并解题

    特殊情况:传入的数组为空数组,没有任何元素,直接返回新数组[1]。

    正常情况:

    第一种情况,当数组最后一个元素不是9的时候,直接将数组的最后一个元素上加1,返回此数组即可。

    第二种情况,当数组最后一个元素是9的时候,这事需要考虑是所有元素都为9,还是部分数组元素为9,因为全部元素都是9的时候就涉及到数组扩容了。

    对此使用while循环,从后往前,先判断元素本身的值加上1后是否等于10,如果等于10,则将该元素重新赋值为0,索引向前移动一位,继续循环。

    如果数组的全部元素都是9,那么索引每次向前循环自减的时候,最后会变成-1,即当索引等于-1时,此数组中所有元素都是9,此时就可以直接数组扩容了,一位整型数组元素的默认值是0,只需要将新数组的第一个元素赋值为1即可,此时的新数据就是最后的结果。

    如果数组的部分元素为9,那么while循环会在元素连续为9的前一个索引位置停下,只需要将此索引位置的元素值加1返回原数组即可。

    public int[] plusOne(int[] digits) {
        if (digits.length == 0) {
            return new int[]{1};
        }
        int lastInt = digits[digits.length-1]+1;
        if (lastInt == 10) {
            int n = digits.length-1;
            while ( n >= 0 && (digits[n]+1) == 10) {
                digits[n] = 0;
                n--;
            }
            if (n != -1) {
                digits[n] = digits[n] + 1;
                return digits;
            } else {
                int[] newInt = new int[digits.length+1];
                newInt[0] = 1;
                return newInt;
            }
        } else {
            digits[digits.length-1] = lastInt;
            return digits;
        }
    }
    

    03 小结

    上面的解法提交的时候,综合用时0ms,打败了100%的人,是第一次获得这样的结果!容我开心下,哈哈!以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    TabControl添加关闭按钮
    Windows & RabbitMQ:集群(clustering) & 高可用(HA)
    Windows & RabbitMQ:Shovel
    15项最佳电子产品影响人类未来
    收藏很久的开关电源书籍
    我也不想这样(转载)
    vbs 脚本轻松搞定JDK的环境变量配置
    开关电源基本知识
    浅谈软件开发定律系列之帕金森定律(Parkinson’s Law)
    堕落的时候看看——清华大学老师的一席话
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9874674.html
Copyright © 2020-2023  润新知