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

rust学习笔记6-数组练习704. 二分查找

上次说到rust所有权看看它和其他语言比有什么优势,就以python为例


# Python3
def test():
    a = [1, 3, -4, 7, 9]
    print(a[4])
    b = a  # 所有权没有发生转移
    del b[4]
    print(a[4])  # 由于b做了删除,导致a再度访问报数组越界


if __name__ == '__main__':
    test()

运行结果

再看rust

fn main() {
    
    let a = vec![1, 3, -4, 7, 9];
    println!("{}", a[4]);
    let mut b = a; // a is moved to b 所有权已发生转移
    b.pop();
    println!("{}", a[4]);  // 编译直接报错,无法运行
    
}

rust通过所有权机制,让一个值或者一块内存只能有一个变量来控制的方式,一旦出现多个变量访问,编译直接报错,根本上杜绝了数组越界等内存错误。这点明显强于Python,Python要想解决此问题只能考虑使用深拷贝

import copy


# Python3
def test():
    a = [1, 3, -4, 7, 9]
    print(a[4])
    b = copy.deepcopy(a)  # 使用深拷贝
    del b[4]
    print(a[4])  # 使用深拷贝a,b是两块不同内存不会受到影响


if __name__ == '__main__':
    test()

vec动态数组, 如果学过Java,可以暂时把它当做ArrayList, 除了内存管理不一样,其他核心功能都一样。

下面练习一道算法题

704. 二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
 

提示:

你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。


pub fn search(nums: Vec<i32>, target: i32) -> i32 {
    let mut left = 0;
    // len()函数返回值是usize类型,要转义为i32,不要直接使用
    let mut right = (nums.len() - 1) as i32;
    while left <= right {
        let middle = (left + right) / 2  ;
        if nums[middle as usize] > target {
            right = middle - 1;
        }else if nums[middle as usize] < target {
            left = middle + 1;
        }else {
            return  middle;
        }
    }
    return  -1;
        
}
fn main() {

    let nums = vec![-1,0,3,5,9,12];
    println!("{}", search(nums, 9));
}

总结这道题是一道基础题,之前其他语言也做过,不难, 需要注意的一点nums.len()的返回值是usize类型需要先转换i32,然后在nums[middle as usize]在转换了,有人可能疑惑这不是多此一举,所有类型都是声明usize不就行了吗,答案是不行,因为提交leetcode会报数组越界问题。

相关文章:

  • MacOS本地部署Deepseek,不联网也可以使用AI,保护隐私
  • Android 数据库查询对比(APN案例)
  • 【洛谷贪心算法】P1106删数问题
  • 大模型应用落地具体规划方案
  • 如何连接 AWS 上的服务器
  • 模型的在线量化和离线量化
  • C语言自定义类型:联合和枚举
  • 《今日AI-人工智能-编程日报》整理于——头条新闻、豆包日报
  • reCAPTCHA v3 实现笔记
  • JavaScript——前端基础3
  • 周边游平台设计与实现(代码+数据库+LW)
  • 智能文档解析与语义分割:LlamaIndex 节点解析器模块全解
  • cpp重写堆的比较函数
  • 手写RPC框架-V1版本
  • 无人机与AI!
  • MyBatis-Plus注解配置:@TableName、@TableId、@TableField
  • 浙江大学《程序设计入门-c语言》第一周笔记
  • Java进阶——Stream流以及常用方法详解
  • 蓝桥杯 - 简单 - 俄罗斯方块
  • IDEAPyCharm安装ProxyAI(CodeGPT)插件连接DeepSeek-R1教程
  • 个人建站项目/网站生成
  • 如何做地方网站推广/网站seo分析常用的工具是
  • 做网站asp/常州seo博客
  • 设计师逛的网站/网站怎么优化关键词排名
  • 网站管理工作流程/产品推广
  • 怎么在建设部网站查注册造价师/腾讯云域名购买