首页 > 其他分享 >[Leetcode] 0066. 加一

[Leetcode] 0066. 加一

时间:2023-10-18 10:47:16浏览次数:38  
标签:digits 加一 int 元素 末尾 0066 数组 textit Leetcode

66. 加一

题目描述

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

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

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

解法

方法一:找出最长的后缀 9

思路

当我们对数组 \(\textit{digits}\) 加一时,我们只需要关注 \(\textit{digits}\) 的末尾出现了多少个 \(9\) 即可。我们可以考虑如下的三种情况:

如果 \(\textit{digits}\) 的末尾没有 \(9\),例如 \([1, 2, 3]\),那么我们直接将末尾的数加一,得到 \([1, 2, 4]\) 并返回;

如果 \(\textit{digits}\) 的末尾有若干个 \(9\),例如 \([1, 2, 3, 9, 9]\),那么我们只需要找出从末尾开始的第一个不为 \(9\) 的元素,即 \(3\),将该元素加一,得到 \([1, 2, 4, 9, 9]\)。随后将末尾的 \(9\) 全部置零,得到 \([1, 2, 4, 0, 0]\) 并返回。

如果 \(\textit{digits}\) 的所有元素都是 \(9\),例如 \([9, 9, 9, 9, 9]\),那么答案为 \([1, 0, 0, 0, 0, 0]\)。我们只需要构造一个长度比 \(\textit{digits}\) 多 \(1\) 的新数组,将首元素置为 \(1\),其余元素置为 \(0\) 即可。

算法

们只需要对数组 \(\textit{digits}\) 进行一次逆序遍历,找出第一个不为 \(9\) 的元素,将其加一并将后续所有元素置零即可。如果 \(\textit{digits}\) 中所有的元素均为 \(9\),那么对应着「思路」部分的第三种情况,我们需要返回一个新的数组。

复杂度分析

时间复杂度:\(O(n)\),其中 \(n\) 是数组 \(\textit{digits}\) 的长度。

空间复杂度:\(O(1)\)。返回值不计入空间复杂度。

Python3

# class Solution:
#     def plusOne(self, digits: List[int]) -> List[int]:
#         digits = [str(i) for i in digits]
#         num = int("".join(digits)) + 1
#         a = str(num)
#         list1=[]
#         for i in a:
#             list1.append(int(i))
#         return list1

class Solution:
    def plusOne(self, digits: List[int]) -> List[int]:
        n = len(digits)
        for i in range(n-1,-1,-1):
            if digits[i] != 9:
                digits[i] +=1
                for j in range(i+1,n):
                    digits[j] =0
                return digits
        return [1] + [0] * n

C++

class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        int n = digits.size();
        for(int i=n-1;i>=0;--i){
            if(digits[i]!=9){
                ++digits[i];
                for(int j=i+1;j<n;++j)
                    digits[j] =0;
                return digits;
            }
        }
        vector<int> ans(n+1);
        ans[0] = 1;
        return ans;
    }
};

标签:digits,加一,int,元素,末尾,0066,数组,textit,Leetcode
From: https://www.cnblogs.com/yege/p/17771497.html

相关文章

  • [LeetCode] 2530. Maximal Score After Applying K Operations
    Youaregivena 0-indexed integerarray nums andaninteger k.Youhavea startingscore of 0.Inone operation:chooseanindex i suchthat 0<=i<nums.length,increaseyour score by nums[i],andreplace nums[i] with ceil(nums[i]/3).......
  • Leetcode24. 两两交换链表中的节点
    题目描述给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例提交的代码classSolution{ListNodenextNode;publicListNodeswapPairs(ListNodehead){//特殊化处理......
  • Leetcode206. 反转链表
    题目描述给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例提交的代码classSolution{publicListNoderesultHead;publicListNodereverseList(ListNodehead){if(head==null)returnnull;ListNodefirst=recursionOfList(he......
  • [Leetcode] 0058. 最后一个单词的长度
    58.最后一个单词的长度题目描述给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。 示例1:输入:s="HelloWorld"输出:5解释:最后一个单词是“World”,长度为5。......
  • [Leetcode] 0027. 移除元素
    27.移除元素题目描述给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:......
  • leetcode200 岛屿数量
    链接https://leetcode.cn/problems/number-of-islands/description/思路跟岛屿周长差不多...但我觉得这个比岛屿周长还简单。不知道为什么这个算中等题目,岛屿周长算简单题目代码classSolution:defnumIslands(self,grid)->int:ifnotgridornotgrid[0]......
  • Leetcode707. 设计链表
    题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从0开始。实现M......
  • #yyds干货盘点# LeetCode程序员面试金典:H 指数 II
    题目:给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数,citations 已经按照 升序排列 。计算并返回该研究者的h 指数。h指数的定义:h代表“高引用次数”(highcitations),一名科研人员的 h 指数是指他(她)的(n 篇论文中)总共有 h 篇论......
  • #yyds干货盘点# LeetCode程序员面试金典:分发饼干
    1.简述:假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >=g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩......
  • leetcode274 H指数 —— 排序后遍历/差分 c++
    给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数的定义:h 代表“高引用次数”,一名科研人员的 h 指数 是指他(她)至少发表了 h 篇论文,并且每篇论文 至少 被引用 h 次。......