rust练习-2

2022-06-19  本文已影响0人  robertzhai

总结

string 遍历,char比较
vec 当做stack使用,出栈 入栈
vec 变量 修改数据,usize 索引
不支持++, 只能+=
位运算符 >>, 二分查找算法

1. https://leetcode.cn/problems/valid-parentheses/submissions/


pub fn match_str(c1:char,c2:char) -> bool {
        return (c1 == '(' && c2 == ')') || (c1 == '{' && c2 == '}')  || (c1 == '[' && c2 == ']')
}

impl Solution {
    pub fn is_valid(s: String) -> bool {

        if s.len() < 2 {
            return false
        }
        let mut stack:Vec<char> = Vec::new();
        for c in s.chars(){
          let stack_len = stack.len();
           if stack_len == 0 {
               stack.push(c);
            } else {
               if match_str(stack[stack_len-1], c) {
                   stack.pop();
               } else {
                   stack.push(c);
               }
            }
        }
        stack.len() == 0
        
    }   
}

or 
========

impl Solution {
    pub fn is_valid(s: String) -> bool {

        if s.len() < 2 {
            return false
        }
        let mut stack:Vec<char> = Vec::new();
        for c in s.chars(){
          let stack_len = stack.len();
           if stack_len == 0 {
               stack.push(c);
            } else {
               if Solution::match_str(stack[stack_len-1], c) {
                   stack.pop();
               } else {
                   stack.push(c);
               }
            }
        }
        stack.len() == 0
        
    }

    pub fn match_str(c1:char,c2:char) -> bool {
        return (c1 == '(' && c2 == ')') || (c1 == '{' && c2 == '}')  || (c1 == '[' && c2 == ']')
}
}

2. https://leetcode.cn/problems/remove-duplicates-from-sorted-array/submissions/

impl Solution {
    pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
        let total = nums.len();
        if total < 2 as usize {
            return total as i32
        }
        let mut head:usize = 0;
        let mut tail:usize = 1;
        while tail < total {
            if nums[tail] != nums[head] {
                head += 1;
                nums[head] = nums[tail];
            }
            tail += 1;
        }
        let result = head+1 ;
        result as i32

    }
}

3. https://leetcode.cn/problems/search-insert-position/submissions/

impl Solution {
    // 找到第一个 >=target的下标
    pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {

        
        let n = nums.len() as i32;
        let mut result = n;
        let mut leftnum = 0;
        let mut right = n - 1;
        let mut midddle = 0;
        while leftnum <= right {
              midddle = leftnum +  ((right-leftnum)>>1) ;// 必须加() ((right-leftnum)>>1) 
              if nums[midddle as usize] >= target {
                  result = midddle;
                  right = midddle - 1;
              } else {
                  leftnum = midddle + 1;
              }
              
        }
        result

    }
}

4. https://leetcode.cn/problems/maximum-subarray/submissions/

const MAX_NUM:usize = 100001;

impl Solution {
    pub fn max_sub_array_v1(nums: Vec<i32>) -> i32 {

        // dp[i] = max(dp[i-1]+nums[i],  nums[i])  包含第i个的元素的最大和
        let n = nums.len();
        let mut dp:Vec<i32> = vec![0;MAX_NUM];
        dp[0] = nums[0];
        let mut idx:usize = 1;
        let mut sum= 0;
        while idx < n {
            sum = dp[idx-1] + nums[idx] ;
            if sum > nums[idx] {
                dp[idx] = sum;
            } else {
                dp[idx] = nums[idx];
            }
            idx += 1;
        }
        let mut result = dp[0];
        idx = 1;
        while idx < n {
            if dp[idx] > result {
                result = dp[idx];
            }
            idx += 1;
        }
        result
    }

    pub fn max_num(n:i32, m:i32) ->i32 {
        if n > m {
            return n
        }
        m
    }

    pub fn max_sub_array_v2(nums: Vec<i32>) -> i32 {


        let n = nums.len();
        // dp[i] = max(dp[i-1]+nums[i],  nums[i])  包含第i个的元素的最大和
        let mut dp = nums[0]; // dp 滚动数组
        let mut result = dp;
        let mut idx:usize = 1;
        while idx < n {
            dp = Solution::max_num(dp + nums[idx], nums[idx]);
            if result < dp {
                result = dp;
            }
            idx += 1;
        }
        
        result
    }
    pub fn max_sub_array(nums: Vec<i32>) -> i32 {

        // dp[i] = max(dp[i-1]+nums[i],  nums[i])  包含第i个的元素的最大和
        let n = nums.len();
        let mut dp:Vec<i32> = Vec::with_capacity(n);
        // let mut dp: [i32; n] = [0; n];
        dp.push(nums[0]);
        // dp[0] = nums[0];
        let mut idx:usize = 1;
        let mut sum= 0;
        let mut result = dp[0];
        while idx < n {
            // dp[idx] = Solution::max_num(dp[idx-1] + nums[idx], nums[idx]);
            dp.push(Solution::max_num(dp[idx-1] + nums[idx], nums[idx]));
            // if dp[idx] > result {
            //     result = dp[idx];
            // }
            idx += 1;
            
        }
        
        idx = 1;
        for num in dp {
            if num > result {
                result = num;
            }
        }
        // while idx < n {
        //     if dp[idx] > result {
        //         result = dp[idx];
        //     }
        //     idx += 1;
        // }
        result
    }
}
上一篇下一篇

猜你喜欢

热点阅读