首页 > 编程语言 >leetcode 算法笔记 —— 简单题

leetcode 算法笔记 —— 简单题

时间:2022-11-18 14:56:55浏览次数:33  
标签:acc.0 val nums i32 笔记 算法 let pub leetcode

简单题

1、两数之和

impl Solution {
    pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
        let mut mp = HashMap::new();
        for i in 0..nums.len() {
            let num = nums[i];
            if let Some(x) = mp.get(&(target - num)) {
                return vec![*x, i as i32];
            } else {
                mp.insert(num, i as i32);
            }
        }
        vec![]
    }
}

考察 Map 的使用

2、回文数

impl Solution {
    pub fn is_palindrome(x: i32) -> bool {
        if x < 0 || (x != 0 && x % 10 == 0) {
            return false;
        }
        //通过不断取余与短除,算出来回文的左右两个数字,再比较
        let mut x = x;
        let mut y = 0;
        while x > y {
            y = y * 10 + x % 10;
            x = x / 10;
        }
        x == y || x == y / 10
    }
}

考察数字的取余与短除

3、罗马数字转整数

impl Solution {
    pub fn roman_to_int(s: String) -> i32 {
        //遍历,累加,存储上一个字符
        s.chars().fold((0, ' '), |acc, x| {
            match (acc.1, x) {
               ('I', 'V') => (acc.0 + 3, 'V'),
                ('I', 'X') => (acc.0 + 8, 'X'),
                ('X', 'L') => (acc.0 + 30, 'L'),
                ('X', 'C') => (acc.0 + 80, 'C'),
                ('C', 'D') => (acc.0 + 300, 'D'),
                ('C', 'M') => (acc.0 + 800, 'M'),
                (_, 'I') => (acc.0 + 1, 'I'),
                (_, 'V') => (acc.0 + 5, 'V'),
                (_, 'X') => (acc.0 + 10, 'X'),
                (_, 'L') => (acc.0 + 50, 'L'),
                (_, 'C') => (acc.0 + 100, 'C'),
                (_, 'D') => (acc.0 + 500, 'D'),
                (_, 'M') => (acc.0 + 1000, 'M'),
                (_, _) => unreachable!(),
            }
        }).0
    }
}

考察 fold 遍历与多初始值(元组)的应用

4、最长公共前缀

impl Solution {
    pub fn longest_common_prefix(strs: Vec<String>) -> String {
        // 每次比较都是跟之前的一个比较,直到全部比较完毕,并且公共前缀是越比较越短的,因此只需要保留前一个的数据即可。
        // 2 个字符串的比较,可以用 zip + take_while 方法
        strs.split_first().map(|(first, rest)| {
            // 开始时,first即为最长的可能前缀,让它与所有其他字符串比较
            rest.into_iter().fold(first.as_str(), |acc, s| {
                // 从acc中取出
                &acc[
                    // 从0到s(即下一个字符串)
                    0..s.bytes()
                        // 与acc(即当前的最长前缀)
                        .zip(acc.bytes())
                        // 相同的前缀
                        .take_while(|(x, y)| x == y)
                        // 的长度
                        .count()
                    ] // 作为新的acc继续迭代
            })
                // 将结果转换为string
                .to_string()
        })
            // 若无,返回空字符串
            .unwrap_or(String::new())
    }
}

考察fold 遍历 与 zip、take_while 的应用

5、有效的括号

impl Solution {
    pub fn is_valid(s: String) -> bool {
        let mut stack: Vec<char> = vec!['a'];
        for c in s.chars() {
            match c {
                '(' | '[' | '{' => stack.push(c),
                ')' => {if stack.pop().unwrap() != '(' {return false}},
                ']' => {if stack.pop().unwrap() != '[' {return false}},
                '}' => {if stack.pop().unwrap() != '{' {return false}},
                _ => (),
            }
        }
        stack.len() == 1
    }
}

考察栈的应用

6、合并两个有序列表

#[derive(Debug)]
pub struct ListNode {
    pub val: i32,
    pub next: Option<Box<ListNode>>,
}

impl ListNode {
    #[inline]
    fn new(val: i32) -> Self {
        ListNode {
            next: None,
            val,
        }
    }
}

impl Solution {
    pub fn merge_two_lists(list1: Option<Box<ListNode>>, list2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        match (list1, list2) {
            (Some(n1), Some(n2)) =>
                if n1.val < n2.val {
                    Some(Box::new(ListNode { val: n1.val, next: Self::merge_two_lists(n1.next, Some(n2)) }))
                } else {
                    Some(Box::new(ListNode { val: n2.val, next: Self::merge_two_lists(Some(n1), n2.next) }))
                }
            (Some(n1), None) => Some(n1),
            (None, Some(n2)) => Some(n2),
            _ => None
        }
    }
}

考察二叉树结构+递归的应用

7、删除有序数组的重复项

impl Solution {
    //因为是单调递增的,那么相等的元素是挨着的,只要判断该元素是否与他前一个元素是否相等就可以知道该元素是否出现过啦。
    pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
        let mut i = 1;
        for j in 1..nums.len() {
            if nums[j] != nums[j - 1] {
                nums[i] = nums[j];
                i += 1;
            }
        }
        i as i32
    }
}

考察双指针算法

8、移除元素

impl Solution {
    pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
        //双指针法
        // nums.retain(|&x| x != val);
        // nums.len() as i32
        let mut i = 0;
        for j in 0..nums.len() {
            if nums[j] != val {
                nums[i] = nums[j];
                i += 1;
            }
        }
        i as i32
    }
}

考察双指针法

9、搜索插入位置

impl Solution {
    pub fn search_insert(nums: Vec<i32>, target: i32) -> i32 {
        // nums.binary_search(&target).unwrap_or_else(|x|x) as i32
        let mut l: usize = 0;
        let mut r: usize = nums.len();
        while l < r {
            let m = (l + r) / 2;
            if target == nums[m] {
                return m as i32;
            } else if nums[m] > target {
                // r = m -1 可能导致 r 为负数。
                r = m;
            } else {
                // 如果令 l = m,由于 (l + r) /2 是向下取整,如果取得 m = l,这会导致死循环。而 m 已经排除,故另令 l = m + 1。
                // 如果目标值在 m 与 m+1 之间,按题目要求取 m+1,亦符合要求。
                l = m + 1;
            }
        }
        l as i32
    }
}

考察二分法

标签:acc.0,val,nums,i32,笔记,算法,let,pub,leetcode
From: https://www.cnblogs.com/lemos/p/16903199.html

相关文章

  • 20201302姬正坤第十四章学习笔记
    Linux系统编程第十四章——MySQL数据库系统SQL简述.SQL的概述StructureQueryLanguage(结构化查询语言)简称SQL,它被美国国家标准局(ANSI)确定为关系型数据库语言的美......
  • 实验四:神经网络算法
    姓名:冯莹学号:201613305【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Gr......
  • Typora语法笔记
    1,前言Markdown是一款普通文本编辑器,简洁好用,通过简单的标记语法,使普通文本内容有一定的格式2,Typura简单常用语法2.1标题1,#一级标题2,##二级标题3,###二级标题··......
  • 实验四:神经网络算法实验
    |班级链接|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning||作业链接|https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-Ma......
  • 国内广告平台持续出海,“算法”何以搅动全局?
    文丨熔财经作者|kinki近日,全球营销衡量与体验管理平台AppsFlyer发布了其第15版的《广告平台综合表现报告》。AppsFlyer大中华区总经理王玮博士表示,随着越来越多的中国......
  • python笔记76-types.FunctionType 动态创建函数
    前言types.FunctionType创建函数有2种方式:从已有函数的基础上,创建一个新函数从一个compile构建的函数对象上,创建一个新函数FunctionType使用FunctionType可以用......
  • 学习笔记12
    MySQLMySQL是一个关系数据库系统。在关系数据库中,数据存储在表中。每个表由多个行和列组成。表中的数据相互关联。表也可能与其他表有关联。关系结构使得可在表上运行查询......
  • LeetCode 891 -- 贡献fa
    题目描述子序列宽度之和思路ref代码相似题子数组范围和......
  • 实验四:神经网络算法实验
    【实验目的】理解神经网络原理,掌握神经网络前向推理和后向传播方法;掌握神经网络模型的编程实现方法。【实验内容】1.1981年生物学家格若根(W.Grogan)和维什(W.Wirth)发现了......
  • Python算法题库(入门)
    1. 字符串最后一个单词长度str=input("输入一串字符串:")strList=str.split('')[-1]print(len(strList)) 2. 计算某字符出现的次数str=input("请输入:").......