leetcode66:加一

原题地址:66. 加一 - 力扣(LeetCode)

题目描述

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

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

你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:

复制代码
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。

示例 2:

复制代码
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。

示例 3:

复制代码
输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。

解题思路

题目要求对一个非负整数数组表示的数字加 1,并返回一个新的数组。

这是一个模拟加法操作的题目。主要需要处理两种情况:

  1. 普通情况:直接对最后一位加 1,并根据进位向前处理即可。
  2. 进位到最高位:当最高位有进位时,需要扩展数组长度。

算法思路如下:

  1. 从数组末尾开始遍历,对当前位进行加 1 操作,同时处理进位。
  2. 如果最高位存在进位,则创建一个新的数组,将进位放入最高位。
  3. 返回最终处理后的数组。

源码实现

复制代码
class Solution {
    public int[] plusOne(int[] digits) {
        // 判断输入是否为空
        if (null == digits) {
            return digits; // 空输入直接返回
        }

        // 初始化进位变量为 0
        int cary = 0;

        // 从数组末尾开始遍历
        for (int i = digits.length - 1; i >= 0; i--) {
            if (i == digits.length - 1) { // 处理最低位
                int val = digits[i];
                digits[i] = (val + cary + 1) % 10; // 当前位加 1 并取余数
                cary = (val + cary + 1) / 10; // 更新进位
            } else { // 处理其他位
                int val = digits[i];
                digits[i] = (val + cary) % 10; // 加上进位并取余数
                cary = (val + cary) / 10; // 更新进位
            }
        }

        // 如果最高位还有进位
        if (cary > 0) {
            // 创建新数组,长度为原数组长度 + 1
            int[] temp = new int[digits.length + 1];
            temp[0] = cary; // 将进位放在最高位
            for (int i = 0; i < digits.length; i++) {
                temp[i + 1] = digits[i]; // 将原数组的值复制到新数组
            }
            return temp; // 返回新数组
        }

        // 没有进位,直接返回原数组
        return digits;
    }
}

复杂度分析

时间复杂度
  • 每次加法操作的复杂度为 O(1)O(1),总共需要遍历整个数组,故时间复杂度为:O(n)O(n) 其中 nn 为输入数组的长度。
空间复杂度
  • 如果最高位产生进位,需要额外创建一个长度为 n+1n+1 的新数组,因此空间复杂度为:O(n)O(n)
    • 如果没有进位,则原地修改输入数组,无需额外空间,空间复杂度为 O(1)O(1)。
相关推荐
达达爱吃肉4 分钟前
claude 接入deepseek 运行报错
java·服务器·前端
OctShop大型商城源码4 分钟前
OctShop对比JAVA商城源码_OctShop大型专业级多用户商城源码
java·开发语言·商城系统·小程序商城·octshop
guslegend8 分钟前
AGENT.md,Skill与工程规范
java·开发语言·数据库
周末也要写八哥12 分钟前
C++中单线程方式之无脑上锁
java·开发语言·c++
Reisentyan19 分钟前
[Advance]GoLang Learn Data Day 4
java·数据库·golang
MaCa .BaKa26 分钟前
55-宠物爱心救助领养系统-宠物救助领养系统
java·vue.js·tomcat·maven·springboot·宠物救助领养系统
BD4SXV27 分钟前
线性二次调节器(Linear Quadratic Regulator,LQR)的无限时域最优控制求解与黎卡提方程
算法·自动化
ch.ju34 分钟前
Java Programming Chapter 4——cite
java·开发语言
小张小张爱学习35 分钟前
Spring Boot 多线程并发入门教程:ThreadPoolTaskExecutor + CompletableFuture
java·spring boot·后端
ST——Jess35 分钟前
2026年度传统文化数字化与命理科技(Ethno-tech)行业趋势研究报告:专业级数智工作台的技术壁垒与评测标准
人工智能·科技·算法·架构