当前位置: 首页 > news >正文

用Rust刷LeetCode之66 加一

66. 加一[1]

难度: 简单

alt

func plusOne(digits []int) []int {
    length := len(digits)

    // 从最低位开始遍历,逐位加一
    for i := length - 1; i >= 0; i-- {
        if digits[i] < 9 {
            digits[i]++
            return digits
        }
        digits[i] = 0
    }

    // 如果循环结束仍然没有返回,则说明最高位也进位了,需要在数组首位插入 1
    return append([]int{1}, digits...)
}

解题思路

从最低位开始遍历,逐位加一。如果最高位进位,则在数组首位插入 1。

复杂度分析

时间复杂度:O(n),其中 n 是数组的长度。我们只遍历了数组一次。

空间复杂度:O(1),除了返回的数组,没有其他额外的空间。


Rust版本:

pub fn plus_one(digits: Vec<i32>) -> Vec<i32> {
    let mut digits = digits;
    let length = digits.len();

    for i in (0..length).rev() {
        if digits[i] < 9 {
            digits[i] += 1;
            return digits;
        }
        digits[i] = 0;
    }

    digits.insert(01); // 返回(),而非Vec<i32>
    digits // 或者 return digits;
}


几乎同样的写法,但Rust消耗的内存,比Go还要多一些..

alt
alt

完整的rust代码:

fn main() {
    let digits = vec![123];
    let result = plus_one(digits);
    println!("{:?}", result); // 输出: [1, 2, 4]

    let digits = vec![999];
    let result = plus_one(digits);
    println!("{:?}", result); // 输出: [1, 0, 0, 0]

    let digits = vec![919];
    let result = plus_one(digits);
    println!("{:?}", result); // 输出: [9, 2, 0]
}

pub fn plus_one(digits: Vec<i32>) -> Vec<i32> {
    let mut digits = digits;
    let length = digits.len();

    for i in (0..length).rev() {
        if digits[i] < 9 {
            digits[i] += 1;
            return digits;
        }
        digits[i] = 0;
    }

    digits.insert(01);
    digits // 或者 return digits;
}
alt

(0..length).rev()中这两个语法糖挺不错


在 Rust 中,(0..length) 是一个范围(range)表达式,表示一个从 0 到 length-1 的半开区间。这个范围可以用于迭代、循环和其他需要遍历一系列整数的场景。

.rev() 是对范围进行反向迭代(reverse iteration)的方法调用。它返回一个可以从范围的最后一个元素向前迭代的迭代器。

因此,(0..length).rev() 表达式返回一个迭代器,可以从 length-1 开始迭代到 0。

在上述代码中,(0..length).rev() 用于循环遍历 digits 数组的每个索引,但是从最高位(最后一个元素)开始。这样可以方便地进行进位操作和遍历。


在 Rust 中,范围(range)表达式是一种用于表示一个数值范围的语法结构。它由两个点 .. 组成,并用于创建一个半开区间(half-open interval)。

范围表达式有两种形式:

  1. start..end:表示从 start(包含)到 end(不包含)的半开区间,迭代器将包含从 startend-1 的值。
  2. start..=end:表示从 start(包含)到 end(包含)的闭区间,迭代器将包含从 startend 的值。

参考资料

[1]

66. 加一: https://leetcode.cn/problems/plus-one/

本文由 mdnice 多平台发布

相关文章:

  • 2分钟带你了解什么是Vsync
  • Java爬虫攻略:应对JavaScript登录表单
  • Apache Hive(部署+SQL+FineBI构建展示)
  • Ribbon组件的负载均衡原理
  • 电脑搜不自己的手机热点,其余热点均可!
  • 采样率越高噪声越大?
  • 【redis笔记】分布式锁
  • 【Lidar】基于Python的三维点云数据转二维平面+散点图绘制
  • 2次MD5加密——用于分布式对话
  • Labelme2Yolo labelme格式的json标注转yolo格式txt
  • 【尘缘送书第五期】Java程序员:学习与使用多线程
  • 排序:直接选择排序
  • 分享几种 Java8 中通过 Stream 对列表进行去重的方法
  • 论文精读 MOG2 阴影检测
  • [传智杯 #2 初赛] 1024 程序员节发橙子
  • co模块的前端实现
  • DataBase in Android
  • docker python 配置
  • JavaScript HTML DOM
  • Java应用性能调优
  • Joomla 2.x, 3.x useful code cheatsheet
  • JSDuck 与 AngularJS 融合技巧
  • SpiderData 2019年2月23日 DApp数据排行榜
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 码农张的Bug人生 - 见面之礼
  • 面试遇到的一些题
  • 前端存储 - localStorage
  • 试着探索高并发下的系统架构面貌
  • 数组的操作
  • 微信开源mars源码分析1—上层samples分析
  • 应用生命周期终极 DevOps 工具包
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #includecmath
  • #stm32驱动外设模块总结w5500模块
  • (C语言)逆序输出字符串
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (二)fiber的基本认识
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .Net Core 中间件验签
  • .NET NPOI导出Excel详解
  • .NET开源快速、强大、免费的电子表格组件
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ solr入门 ] - 利用solrJ进行检索
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [CISCN2019 华北赛区 Day1 Web2]ikun
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]