在现代软件开发领域,算法能力对于解决复杂问题至关重要。特别是对于希望进入知名科技公司的人来说,掌握基础算法知识和具备良好的算法思维习惯几乎是必经之路。因此,本系列文章旨在通过每日一道LeetCode题目,帮助读者逐步提升算法水平。
今天我们将探讨的问题是“加一”,让我们先来看看题目描述:
LeetCode 题目链接
给定一个非空数组,该数组中的元素按非负整数的形式排列。任务是对这个整数加一。
数组中的数字按照从最高有效位到最低有效位的顺序存储,即数组的第一个元素是最高的位,每个元素仅包含一个数字。
假设除数字0外,该整数不会以零开头。
题目解析
题目要求我们在给定的数字数组基础上增加1。数组的首位存放最高位数字,每个元素仅包含一个数字。除了数字0以外,这个整数不会以0开头。
示例分析
示例 1: 输入: [1,2,3] 输出: [1,2,4] 解释: 输入数组表示数字 123。 示例 2: 输入: [4,3,2,1] 输出: [4,3,2,2] 解释: 输入数组表示数字 4321。
解题思路
解题的核心在于理解何时会发生进位。具体来说,当某一位数字为9时,加1会导致该位变为0,并向更高位进1。这种进位机制可以从个位、十位、百位等逐渐向上推广。
例如,对于个位数9,加1后会变成0并产生进位;同理,对于两位数99,加1后会变成00并产生进位。这一规律可以一直延伸到更高位。
基于上述分析,我们可以得出两种主要情况:
最高位发生进位
如果最高位发生进位,这意味着所有较低位的数字都是9,加1后这些位都会变为0。此时,我们需要创建一个新的数组,其长度比原数组多1,第一位设置为1以表示进位。
最高位未发生进位
如果最高位没有发生进位,则无需创建新数组,只需对原数组进行适当修改即可。
下面是具体的实现代码:
class Solution { public int[] plusOne(int[] digits) { int carry = 1; for (int i = digits.length - 1; i >= 0; i--) { if (carry == 0) { return digits; } int tmp = digits[i] + carry; carry = tmp / 10; digits[i] = tmp % 10; } if (carry != 0) { int[] result = new int[digits.length + 1]; result[0] = 1; return result; } return digits; } }
以上就是今天的全部内容,如果你觉得这篇文章对你有所帮助,请不要吝惜点赞或分享,你的支持是我继续创作的动力。
相关阅读推荐:
LeetCode 40-60题总结,快速收藏!
LeetCode 刷题实战61:旋转链表
LeetCode 刷题实战62:不同路径
LeetCode 刷题实战63:不同路径 II
LeetCode 刷题实战64:最小路径和