每日一道 LeetCode (14):数组加一

每天 3 分钟,走上算法的逆袭之路。
前文合集
代码仓库
GitHub: https://github.com/meteor1993/LeetCode
Gitee: https://gitee.com/inwsy/LeetCode
题目:数组加一
题目来源:https://leetcode-cn.com/problems/plus-one/
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
解题思路
这道题看完以后,感觉好像很简单的样子, LeetCode 最近几天的题让我一下感觉自己智商又在线了,甚至有了能暴打 LeetCode 的幻觉。
先说下我的思路,整个数组取到最后一位,直接 +1 返回,这不完了么?
感觉自己又能小母牛倒立了。

结果我第一次代码写完,这个世界充满了恶意,把我的脸又一次的按在了地上摩擦。
最开始的代码是这个样子的:
public int[] plusOne(int[] digits) {
digits[digits.length - 1] += 1;
return digits;
}
上面的代码没有问题,可惜没有考虑 9 , 99 , 999 这种进位的情况。
这就很尴尬了,因为传入的结构是数组,传出的结构也是数组,总所周知,数组是不能动态扩容的,这就意味着如果产生了进位我们需要一个新的数组。
而且我们还需要在计算的时候进行判断,判断当前的计算是否产生了进位。
判断进位在前面的文章中介绍过,很简单,我们直接取余数判断余数是否为 0 就可以了,如果余数为0 那么一定产生了进位。
如果整个数组的余数全都变成了 0 ,如 0 , 00 , 000 ,那么传入的数组一定是 9 , 99 , 999 这种,这时候我们搞个新的数组,直接把开头赋值成 1 ,剩余位数全是 0 ,返回就可以了。
代码实现
上面已经把思路说的很清晰了,下面是我写的代码:
public int[] plusOne(int[] digits) {
// 从末尾开始循环
for (int i = digits.length - 1; i >= 0; i--) {
// 先 +1
digits[i]++;
// 取余数, 10 的余数为 0
digits[i] = digits[i] % 10;
// 判断余数是否为 0 ,如果为 0 则再循环一次,产生了进位,不为 0 则可以直接返回
if (digits[i] != 0) return digits;
}
// 如果在上面的循环未返回,则整体产生进位,类似于 9 , 99 , 999 , 9999 这种数组
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}

注释标记的很明确了,稍微有点反人类的就是这个循环是倒序循环,从最后一位开始往前循环。好像最近的题使用到的都是倒序循环。
数组操作的效率是极其高效的,而且我发现,但凡是使用数组操作,在 LeetCode 上基本耗时都是 0ms 。
每日一道 LeetCode (14):数组加一的更多相关文章
- 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (19):合并两个有序数组
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (10):搜索插入位置
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (15):二进制求和
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (3):回文数
前文合集 每日一道 LeetCode 文章合集 题目:回文数 题目来源:https://leetcode-cn.com/problems/palindrome-number/ 判断一个整数是否是回文数 ...
- 每日一道 LeetCode (5):最长公共前缀
前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee: https://gitee.com ...
- 每日一道 LeetCode (6):有效的括号
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (41):阶乘后的零
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
- 每日一道 LeetCode (48):最长回文子串
每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...
随机推荐
- Ethical Hacking - GAINING ACCESS(16)
CLIENT SIDE ATTACKS - Social Engineering Social Engineering Information gathering Tool: Maltego Gath ...
- Ethical Hacking - NETWORK PENETRATION TESTING(18)
Session Hijacking What if the user uses the "remember me" feature? If the user uses this f ...
- scratch编程体感游戏
体感游戏有很多种,最常见的就是摄像头和声控了,今天我们要用scratch编写一系列的体感游戏!!!是不是很激动呢? 首先我们来编摄像头类的: No.1拳头打幽灵 挥动头就能打到幽灵了哟! 具体程序如下 ...
- 3.OSPF协议及链路状态算法
OSPF的特点: 1.使用洪泛法向自治系统内所有路由器发送信息,即路由器通过输出端口向所有相邻的路由器发送信息,而每一个相邻路由器又再次将此信息发往其所有的相邻路由器.最终整个区域内所有路由器都得到了 ...
- 题解 洛谷 P5814 【[CTSC2001]终极情报网】
读完题后不难看出本题是个网络流模型,源点流出的总流量为\(k\),源点向每个和总部直接联系的间谍连边,每个间谍向其能传递的间谍连容量为\(m\)的边,能与德军情报部进行联系的间谍向汇点连容量为\(in ...
- 细说websocket快速重连机制
文|马莹莹 网易智慧企业web前端开发工程师 引言 在一个完善的即时通讯应用中,websocket是极其关键的一环,它为web应用的客户端和服务端提供了一种全双工的通信机制,但由于它本身以及其底层依赖 ...
- Split Screen
Split Screen 是一个用来分屏的 bookmarklet 程序. 它通过 javascript 通信协议实现[1]. 特点 使用 HTML5 <dialog> 元素实现 使用 G ...
- CSS帧动画
CSS帧动画 基础知识 通过定义一段动画中的关键点.关键状态来创建动画.@Keyframes相比transition对动画过程和细节有更强的控制. 过渡动画是两个状态间的变化,帧动画可以处理动画过程中 ...
- 给Django Admin添加验证码和多次登录尝试限制
Django自带的Admin很好用,但是放到生产环境总还差了点什么= = 看看admin的介绍: Django奉行Python的内置电池哲学.它自带了一系列在Web开发中用于解决常见问题或需求的额外的 ...
- PHP xml_set_processing_instruction_handler() 函数
定义和用法 xml_set_processing_instruction_handler() 函数规定当解析器在 XML 文档中找到处理指令时被调用的函数. 处理指令包含在 <? 和 ?> ...