算法leetcode|66. 加一(rust重拳出击)


文章目录


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 ,那的确就完事了,但如果是9的话,就要产生进位,而不是简单的加一了。
  • 进位之后,前一位就要加一,又有可能产生进位,所以这道题主要就是处理进位。
  • 最终有可能所有的数字都是9,从末尾一路进位到头,空间不够了,这种情况下就只能申请新的空间了,要多一位出来。
  • 分析参数有三种可能性:
    1. 末尾没有 9,例如 1,2,3,那么我们直接将末尾的数加一,得到 1,2,4 并返回。
    2. 末尾有若干个 9 ,例如 1,2,3,9,9,那么我们只需要逆向找出第一个不为 9 的元素,即 3,将该元素加一,同时途中的 9 都变为0,得到 1,2,4,0,0 并返回。
    3. 所有元素都是 9,例如 9,9,9,9,9,那么答案为 1,0,0,0,0,0。我们只需要构造一个长度比参数长度多 1 的新数组,将首元素置为 1,其余元素置为 0 即可。
  • 所以这道题可以这样处理,从数组末位逆向查找第一个不是 9 的数字,加一,途中是 9 的位都变成0,进位。
  • 如果所有的数字都是 9,那么直接申请新的空间,比源数组长度加一,然后首位赋值为1即可。

题解:

rust:

rust 复制代码
impl Solution {
    pub fn plus_one(mut digits: Vec<i32>) -> Vec<i32> {
        let n = digits.len();

        for i in (0..n).rev() {
            if digits[i] == 9 {
            	// 进位变为0
                digits[i] = 0;
            } else {
            	// 第一个不是9的位
                digits[i] += 1;
                return digits;
            }
        }

        // digits 中所有的元素均为 9
        let mut ans = vec![0; n + 1];
        ans[0] = 1;
        return ans;
    }
}

go:

go 复制代码
func plusOne(digits []int) []int {
    n := len(digits)

	for i := n - 1; i >= 0; i-- {
		if digits[i] == 9 {
			// 进位变为0
			digits[i] = 0
		} else {
			// 第一个不是9的位
			digits[i]++
			return digits
		}
	}

	// digits 中所有的元素均为 9
	digits = make([]int, n+1)
	digits[0] = 1
	return digits
}

c++:

cpp 复制代码
class Solution {
public:
    vector<int> plusOne(vector<int>& digits) {
        const int n = digits.size();

        for (int i = n - 1; i >= 0; --i) {
            if (digits[i] == 9) {
                // 进位变为0
                digits[i] = 0;
            } else {
                // 第一个不是9的位
                ++digits[i];
                return digits;
            }
        }

        // digits 中所有的元素均为 9
        vector<int> ans(n + 1);
        ans[0] = 1;
        return ans;
    }
};

python:

python 复制代码
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:
                # 进位变为0
                digits[i] = 0
            else:
                # 第一个不是9的位
                digits[i] += 1
                return digits

        # digits 中所有的元素均为 9
        return [1] + [0] * n

java:

java 复制代码
class Solution {
    public int[] plusOne(int[] digits) {
        final int n = digits.length;

        for (int i = n - 1; i >= 0; --i) {
            if (digits[i] == 9) {
                // 进位变为0
                digits[i] = 0;
            } else {
                // 第一个不是9的位
                ++digits[i];
                return digits;
            }
        }

        // digits 中所有的元素均为 9
        int[] ans = new int[n + 1];
        ans[0] = 1;
        return ans;
    }
}

非常感谢你阅读本文~

欢迎【点赞】【收藏】【评论】三连走一波~

放弃不难,但坚持一定很酷~

希望我们大家都能每天进步一点点~

本文由 二当家的白帽子:https://le-yi.blog.csdn.net/ 博客原创~


相关推荐
GetcharZp13 小时前
玩转 Linux 机器视觉:手把手带你搞定 Ubuntu 下海康工业相机 C++ SDK
后端
星星在线17 小时前
MusicFree:一个「All in One」的个人音乐服务器,让听歌回归简单
前端·后端
IT_陈寒17 小时前
Redis的SETNX并发问题让我加了三天班
前端·人工智能·后端
demo007x18 小时前
Docling 文档转换以及技术架构分析
前端·后端·程序员
袋鱼不重19 小时前
我的神奇同事,AI 用多了居然写了个 Open In Codex
前端·后端·ai编程
用户83562907805119 小时前
使用 Python 操作 Word 内容控件
后端·python
像我这样帅的人丶你还19 小时前
啥? 前端也要会干Java?🛵🛵🛵
后端
Hommy8819 小时前
【剪映小助手】添加贴纸接口(Add Sticker)
后端·github·剪映小助手·视频剪辑自动化·剪映api
通信小呆呆19 小时前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人