每天 3 分钟,走上算法的逆袭之路。

前文合集

每日一道 LeetCode 前文合集

代码仓库

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):数组加一的更多相关文章

  1. 每日一道 LeetCode (8):删除排序数组中的重复项和移除元素

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  2. 每日一道 LeetCode (19):合并两个有序数组

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  3. 每日一道 LeetCode (10):搜索插入位置

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  4. 每日一道 LeetCode (15):二进制求和

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  5. 每日一道 LeetCode (3):回文数

    前文合集 每日一道 LeetCode 文章合集 题目:回文数 题目来源:https://leetcode-cn.com/problems/palindrome-number/ 判断一个整数是否是回文数 ...

  6. 每日一道 LeetCode (5):最长公共前缀

    前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee: https://gitee.com ...

  7. 每日一道 LeetCode (6):有效的括号

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  8. 每日一道 LeetCode (41):阶乘后的零

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

  9. 每日一道 LeetCode (48):最长回文子串

    每天 3 分钟,走上算法的逆袭之路. 前文合集 每日一道 LeetCode 前文合集 代码仓库 GitHub: https://github.com/meteor1993/LeetCode Gitee ...

随机推荐

  1. Vue全家桶之一Vue(基础知识篇)

    全家桶:Vue本身.状态管理.路由.   异步组件:     

  2. 设计模式:decorator模式

    两点: 继承同一虚接口,实现数据一致性 桥接方式指向被装饰类 目的:在不改变被装饰类功能的前提下增加新功能 特点:继承是子类和父类强耦合,桥接是低耦合 例子: class Print //抽象接口 { ...

  3. JS内存机制

    在看JS内存机制之前我们先来看一下JS是门什么样的语言,他又有哪些变量类型. 动静态,强弱类型 静态:在使用之前就需要确认其变量数据类型. 动态:在运行过程中需要检查数据类型. 强类型:不支持隐式类型 ...

  4. [并发编程] -- ThreadPoolExecutor篇

    Executor框架 Executor框架的两级调度模型(基于HotSpot) 在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定 ...

  5. 硬核干货:5W字17张高清图理解同步器框架AbstractQueuedSynchronizer

    前提 并发编程大师Doug Lea在编写JUC(java.util.concurrent)包的时候引入了java.util.concurrent.locks.AbstractQueuedSynchro ...

  6. python3 url编码与解码

    在通过浏览器修改数据库时,要对url内容进行编码 quote()编码; unquote()解码; 直接上代码:

  7. Django学习路26_转换字符串大小写 upper,lower

    在 urls 中注册 url(r'getstr',views.getstr) 在 views.py 中添加函数 def getstr(request): string = 'abc' string_2 ...

  8. PHP curl_share_init函数

    (PHP 5 >= 5.5.0) curl_share_init — 初始化一个 cURL 共享句柄 说明 resource curl_share_init ( void ) 允许两个 cURL ...

  9. C/C++编程笔记:C语言成绩管理系统!链式结构的管理系统源码分享

    最近很多同学因为学校的要求,需要完成自己的那个C语言课程设计,于是就有很多人私信或者加我私聊我,问的最多的还是<学生成绩管理系统>,其实当你项目写多了你就会发现:其实各类的管理系统都离不开 ...

  10. electron-react-umi模板

    electron-react-umi-tpl github English Version 更新日志: 2020-06-08 添加全量更新功能 2020-06-29 添加远程增量更新功能,无需下载包来 ...