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

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会报数组越界问题。


http://www.kler.cn/a/561343.html

相关文章:

  • MySQL数据,查询QPS,TPS 数据
  • 二分查找理解
  • xss-lab
  • 计算机视觉算法实战——异常检测(主页有源码)
  • OpenGL 03--顶点着色器、片段着色器、元素缓冲对象
  • 刷题日记5
  • 【TVM教程】为 NVIDIA GPU 自动调度神经网络
  • 【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮
  • 使用torch.compile进行CPU优化
  • .NET Core MVC IHttpActionResult 设置Headers
  • IDEA-插件开发踩坑记录-第五坑-没有飞机场导致无法访问GITHUB导致的讨厌问题
  • 【深度学习神经网络学习笔记(一)】深度学习介绍
  • 在vite上使用tailwindcss详细教程(不报错)
  • [C++][cmake]使用C++部署yolov12目标检测的tensorrt模型支持图片视频推理windows测试通过
  • Go语言--语法基础3--下载安装--Linux基础操作命令
  • 图神经网络:拓扑数据分析的新时代
  • DeepSeek AI智能运营:重构企业效率的范式革命
  • kafka数据拉取和发送
  • BUU41 [GYCTF2020]FlaskApp1【SSTI】
  • TSMaster【第十四篇:弹指神通——自动化测试框架】