leetcode
leetcode 51 ~ 100
加一

加一

难度:

标签:

题目描述

给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。

最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。

你可以假设除了整数 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]

 

提示:

  • 1 <= digits.length <= 100
  • 0 <= digits[i] <= 9

代码结果

运行时间: 40 ms, 内存: 14.8 MB


/* 
 * 题目思路:
 * 使用Java Stream实现加一操作。
 * 由于Stream不支持原地修改,需要将结果收集为新的数组。
 * 依然需要从后向前处理数组元素,并考虑进位问题。
 */
 
import java.util.stream.IntStream;
 
public int[] plusOne(int[] digits) {
    int carry = 1;
    for (int i = digits.length - 1; i >= 0; i--) {
        int sum = digits[i] + carry;
        digits[i] = sum % 10;
        carry = sum / 10;
    }
    if (carry == 0) {
        return digits;
    }
    int[] newNumber = new int[digits.length + 1];
    newNumber[0] = 1;
    return newNumber;
}

解释

方法:

这个题解的思路是先在数组最前面添加一个0作为进位标志,然后从数组末尾开始遍历。如果当前位不为9,直接加1然后结束遍历;如果当前位为9,则将其置为0,继续遍历前一位。最后根据最前面的进位标志是否为0,决定是否要将其去掉。

时间复杂度:

O(n)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么需要在数组最前面添加一个0作为进位标志,而不是直接在原数组上进行操作?
在数组最前面添加一个0作为进位标志的主要原因是为了简化代码处理进位的逻辑。这种方法避免了在数组的最高位产生进位时需要额外的数组扩展操作。例如,当数组中的所有数字均为9时,其结果需要在最高位前增加一个新的最高位(1),直接在数组前添加一个0可以在一次遍历中解决这个问题,如果最前面的0变为1,则保留,否则去除。这样做可以使代码更为简洁和高效。
🦆
在处理最高位进位时,如果数字全部是9(例如[9,9,9]),这种方法是否能正确处理并返回正确的结果,如[1,0,0,0]?
是的,这种方法可以正确处理全部数字为9的情况。例如对于输入[9, 9, 9],在数组前添加0后变为[0, 9, 9, 9]。从数组末尾开始遍历,每个9都会变成0并继续向前进位,最终数组变为[1, 0, 0, 0]。由于最前面的0变为1,因此不会被去除,最终正确返回[1, 0, 0, 0]。
🦆
代码中有一个break语句,在某些情况下直接终止循环。这是否意味着不是所有的元素都需要检查或修改?请解释这种情况。
确实,不是所有的元素都需要检查或修改。break语句的使用是为了提高算法效率,避免不必要的操作。当遍历到数组中的某一个元素并且该元素不是9时,意味着这个位置可以直接加1而不需要进位,因此后续的元素也不需要修改,这时可以直接终止循环。例如,对于输入[1, 2, 3],加1操作仅发生在最后一个元素上变为[1, 2, 4],遍历到3时直接将其改为4并终止循环。
🦆
如果初始数组的所有位都是9,如[9, 9, 9, 9],请详细说明算法是如何处理这种情况的。
对于全部都是9的数组[9, 9, 9, 9],算法首先会在数组前添加一个0,变为[0, 9, 9, 9, 9]。然后从数组的最后一位开始遍历,每个9都会变成0,并且由于持续进位,最前面的0会变成1。所以,最终数组会从[0, 9, 9, 9, 9]变为[1, 0, 0, 0, 0]。由于最前面的0变为1,这个1是必需的,因为它代表了一个新的最高位,最终算法返回[1, 0, 0, 0, 0]。这样处理确保了算法能够有效应对所有元素为9的情况,正确地增加一个位数。

相关问题

字符串相乘

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

 

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

 

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

二进制求和

给你两个二进制字符串 ab ,以二进制字符串的形式返回它们的和。

 

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

 

提示:

  • 1 <= a.length, b.length <= 104
  • ab 仅由字符 '0''1' 组成
  • 字符串如果不是 "0" ,就不含前导零

给单链表加一

给单链表加一

数组形式的整数加法

整数的 数组形式  num 是按照从左到右的顺序表示其数字的数组。

  • 例如,对于 num = 1321 ,数组形式是 [1,3,2,1]

给定 num ,整数的 数组形式 ,和整数 k ,返回 整数 num + k数组形式

 

示例 1:

输入:num = [1,2,0,0], k = 34
输出:[1,2,3,4]
解释:1200 + 34 = 1234

示例 2:

输入:num = [2,7,4], k = 181
输出:[4,5,5]
解释:274 + 181 = 455

示例 3:

输入:num = [2,1,5], k = 806
输出:[1,0,2,1]
解释:215 + 806 = 1021

 

提示:

  • 1 <= num.length <= 104
  • 0 <= num[i] <= 9
  • num 不包含任何前导零,除了零本身
  • 1 <= k <= 104