美文网首页
rust练习-3

rust练习-3

作者: robertzhai | 来源:发表于2022-07-17 11:14 被阅读0次

总结

VecDeque
Vec reverse
as 类型转换
usize类型 -1 不会小于0,永远>=0
双指针合并
vec 索引类型必须强制转换成usize

1、https://leetcode.cn/problems/remove-element/submissions/

impl Solution {
    pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {

        let total = nums.len() as usize;
        let mut head :usize = 0;
        let mut tail :usize = 0;
        while tail < total {
            if nums[tail] == val {
                tail +=1;
            } else {
                nums[head] = nums[tail];
                head +=1;
                tail +=1;
            }
        }
        head as i32

    }
}

2、https://leetcode.cn/problems/plus-one/submissions/


use std::collections::VecDeque;
impl Solution {
    pub fn plus_one(digits: Vec<i32>) -> Vec<i32> {

        let total = digits.len() as usize;
        let mut result:Vec<i32> = Vec::with_capacity(total+1);
        let mut idx = total - 1 ;
        let mut tmp:i32 = 1;
        while idx >= 0 {
            tmp += digits[idx];
            result.push(tmp%10);
            tmp = tmp/10;
            if idx == 0 {
                break;
            }
            idx -=1;
        }
        if tmp > 0 {
            result.push(tmp);
        }
        result.reverse();
        result

    }

     pub fn plus_one_v1(digits: Vec<i32>) -> Vec<i32> {

        let total = digits.len() as usize;
        let mut result = VecDeque::with_capacity(total+1);
        let mut idx = total - 1 ;
        let mut tmp = 1;
        while idx >= 0 {
            tmp += digits[idx];
            result.push_front(tmp%10);
            tmp = tmp/10;
            if idx == 0 {
                break;
            }
            idx -=1;
        }
        if tmp > 0 {
            result.push_front(tmp);
        }
        Vec::from(result)

    }
}

3、https://leetcode.cn/problems/sqrtx/

impl Solution {
    pub fn my_sqrt(x: i32) -> i32 {

        let tmp = x as u64;
        let mut left = 0 as u64;
        let mut right = x as u64;
        let mut mid:u64;
        let mut result:u64 = 0 ;
        while left <= right {
            mid = ((right-left)>>1) + left;
            if mid*mid <= tmp {  // mid 从左边向右逼近最终结果
                left = mid + 1;
                result = mid;
            } else  {
                right = mid - 1;
            } 
        }
        result as i32

    }
}

4、https://leetcode.cn/problems/merge-sorted-array/submissions/

impl Solution {
    pub fn merge(nums1: &mut Vec<i32>, m: i32, nums2: &mut Vec<i32>, n: i32) {

       let mut idx1 = m-1;
       let mut idx2 = n-1;
       let mut idx_result = (m + n - 1) as usize;
       
       while idx1 >= 0 && idx2 >=0 {
           if nums1[idx1 as usize] <= nums2[idx2  as usize] {
               nums1[idx_result] = nums2[idx2 as usize];
               idx2 -=1;
               idx_result -=1;
           } else {
               nums1[idx_result] = nums1[idx1 as usize];
               idx1 -=1;
               idx_result -=1;
           }
       }
    //    while idx1 >=0 {
    //        nums1[idx_result] = nums1[idx1 as usize];
    //        idx1 -=1;
    //        idx_result -=1;
    //    }
        while idx2 >=0 {
            nums1[idx_result] = nums2[idx2 as usize];
            idx2 -=1;
            idx_result -=1;
       }
       

    }


    pub fn merge_v1(nums1: &mut Vec<i32>, m: i32, nums2: &mut Vec<i32>, n: i32) {

       let mut idx1:usize = 0;
       let mut idx2:usize = 0;
       let musize = m as usize;
       let nusize = n as usize;
       let mut result = Vec::with_capacity(musize+nusize);
       while idx1 < musize && idx2 < nusize {
           if nums1[idx1] <= nums2[idx2] {
               result.push(nums1[idx1]);
               idx1+=1;
           } else {
               result.push(nums2[idx2]);
               idx2+=1;
           }
       }
       while idx1 < musize {
           result.push(nums1[idx1]);
           idx1+=1;
       }
        while idx2 < nusize {
           result.push(nums2[idx2]);
           idx2+=1;
       }
       idx1 = 0;
       for num in result {
           nums1[idx1] = num;
           idx1+=1;
       }

    }
}

相关文章

  • rust练习-3

    总结 VecDequeVec reverseas 类型转换usize类型 -1 不会小于0,永远>=0双指针合并v...

  • Web3极客日报 #5

    Rust 编程小练习 Rustlings https://github.com/rust-lang/rustlin...

  • Rust语言编程实例100题-035

    Rust语言编程实例100题-035 题目:字符串反转练习,如将字符串 "i like rust!" 反转为"!t...

  • Rust语言编程实例100题-066

    Rust语言编程实例100题-066 题目:Rust指针练习。先来理解下引用和借用的概念。引用是作为参数传递给函数...

  • rust练习-1

    to be continued

  • rust练习-2

    总结 string 遍历,char比较vec 当做stack使用,出栈 入栈vec 变量 修改数据,usize 索...

  • rust练习-5

    总结 二分查找,容易溢出 用 u64String chars next 遍历,match匹配值String int...

  • rust练习-4

    总结 string的字符比较和遍历HashMap统计HashSet判重滑动窗口 1、https://leetcod...

  • Rust语言编程实例100题-059

    Rust语言编程实例100题-059 题目:Rust高阶函数练习。高阶函数是指以函数为参数或者返回值的函数,是函数...

  • Rust语言编程实例100题-060

    Rust语言编程实例100题-060 题目:Rust高阶函数练习。高阶函数是指以函数为参数或者返回值的函数,是函数...

网友评论

      本文标题:rust练习-3

      本文链接:https://www.haomeiwen.com/subject/xlgrvrtx.html