From f31747f579107404753f216279e76aaab14ce0bb Mon Sep 17 00:00:00 2001 From: chenhao Date: Tue, 20 Feb 2024 11:50:08 +0800 Subject: [PATCH] add rust leetcode --- .gitignore | 3 +- rustpractice/Cargo.lock | 7 ++++ rustpractice/Cargo.toml | 8 ++++ rustpractice/src/main.rs | 21 ++++++++++ rustpractice/src/p13.rs | 75 ++++++++++++++++++++++++++++++++++++ rustpractice/src/p14.rs | 68 ++++++++++++++++++++++++++++++++ rustpractice/src/problem1.rs | 56 +++++++++++++++++++++++++++ 7 files changed, 237 insertions(+), 1 deletion(-) create mode 100644 rustpractice/Cargo.lock create mode 100644 rustpractice/Cargo.toml create mode 100644 rustpractice/src/main.rs create mode 100644 rustpractice/src/p13.rs create mode 100644 rustpractice/src/p14.rs create mode 100644 rustpractice/src/problem1.rs diff --git a/.gitignore b/.gitignore index b906297..611fd87 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ *.exe *.o *.xml -**.vscode \ No newline at end of file +**.vscode +rustpractice/target/* \ No newline at end of file diff --git a/rustpractice/Cargo.lock b/rustpractice/Cargo.lock new file mode 100644 index 0000000..1deea27 --- /dev/null +++ b/rustpractice/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "rustpractice" +version = "0.1.0" diff --git a/rustpractice/Cargo.toml b/rustpractice/Cargo.toml new file mode 100644 index 0000000..8ee2d6e --- /dev/null +++ b/rustpractice/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "rustpractice" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/rustpractice/src/main.rs b/rustpractice/src/main.rs new file mode 100644 index 0000000..18bf32c --- /dev/null +++ b/rustpractice/src/main.rs @@ -0,0 +1,21 @@ +pub mod problem1; +pub mod p13; +pub mod p14; +// use problem1::problem1::Solution; +// use p13::p13::Solution; + +fn main() { + println!("Hello, world!"); + // let a = Solution{}; + + // let nums = vec![3,2,4]; + + + // let r = a.two_sum(nums, 6); + // println!("{:?}", r); + + + + + +} diff --git a/rustpractice/src/p13.rs b/rustpractice/src/p13.rs new file mode 100644 index 0000000..1d17358 --- /dev/null +++ b/rustpractice/src/p13.rs @@ -0,0 +1,75 @@ +// #[cfg(test)] +pub mod p13 { + use std::{cmp::min, collections::HashMap, hash::Hash}; + pub struct Solution {} + impl Solution { + pub fn roman_to_int(self, s: String) -> i32 { + let mut done_map = HashMap::new(); + let mut m = HashMap::new(); + m.insert("I", 1); + m.insert("V", 5); + m.insert("X", 10); + m.insert("L", 50); + m.insert("C", 100); + m.insert("D", 500); + m.insert("M", 1000); + m.insert("IV", 4); + m.insert("IX", 9); + m.insert("XL", 40); + m.insert("XC", 90); + m.insert("CD", 400); + m.insert("CM", 900); + + // let b = &s[0..s.len()]; + // let part1 = &s[0..0]; + // println!("part1 : {}";', part1); + println!("s len:{:?}", s.len()); + let mut sum: i32 = 0; + for i in 0..s.len() { + match done_map.get(&i) { + Some(t) => {} + None => { + let last = min(i + 2, s.len()); + let b = &s[i..i + 1]; + let b2 = &s[i..last]; + println!("i {} b2 {}", i, b2); + // let c = b2.to_owned(); + if ("IV" == b2) + || ("IX" == b2) + || ("XL" == b2) + || ("XC" == b2) + || ("CD" == b2) + || ("CM" == b2) + { + // println!("sss"); + let v = m.get(b2).unwrap(); + println!("b2 {} add {}", b2, v); + for j in i..last { + done_map.insert(j, 0); + } + sum = sum + v; + continue; + } else { + let v = m.get(b).unwrap(); + println!("b {} add {}", b, v); + done_map.insert(i, 0); + sum = sum + v; + } + + println!("-------------------- {:?}", b.to_string()); + } + } + } + println!("{}", sum); + sum + } + } + + #[test] + pub fn test() { + let a = Solution {}; + let s = "MCMXCIV"; + + assert_eq!(1994, a.roman_to_int(s.to_string())); + } +} diff --git a/rustpractice/src/p14.rs b/rustpractice/src/p14.rs new file mode 100644 index 0000000..393c758 --- /dev/null +++ b/rustpractice/src/p14.rs @@ -0,0 +1,68 @@ +#[cfg(test)] +pub mod p14 { + use std::cmp::min; + + pub struct Solution {} + + impl Solution { + pub fn longest_common_prefix(strs: Vec) -> String { + // let max_str = strs.iter().max(); + // let min_str = strs.iter().min(); + // // println!("max_str {:?}",max_str.unwrap()); + // // println!("min_str {:?}",min_str.unwrap()); + + // let max_chrs = max_str.unwrap().chars(); + // let min_chrs = min_str.unwrap().chars(); + // // println!("{:?} {:?}",max_chrs, min_chrs); + // let b = max_chrs.zip(min_chrs).take_while(|x| x.0 == x.1); + // println!("==============b==={:?}",b); + // let r = b.map(|x| x.0).collect(); + // // println!("==============R==={:?}",r); + // r + // // strs.iter() + if strs.len() == 0 { + return "".to_string(); + } + // let answer:String = "".to_string(); + let firststr = &strs[0]; + let mut ans = firststr.to_string(); + + for i in 1..strs.len() { + ans = Self::strcmp(&ans, &strs[i]); + // firststr = &answer; + println!("{:?}", ans); + if ans.len()==0 { + break; + } + + } + ans + + } + pub fn strcmp(str1: &String, str2: &String) -> String { + let minlen = min(str1.len(), str2.len()); + let mut index: usize = 0; + for i in 0..minlen { + if str1.as_bytes()[i] != str2.as_bytes()[i] { + break; + } else { + index += 1; + } + } + str1[..index].to_string() + } + } + #[test] + pub fn test() { + // let solution = Solution {}; + // let s = "MCMXCIV"; + let strs = vec![ + "flower".to_string(), + "fzow".to_string(), + "flight".to_string(), + ]; + let a = Solution::longest_common_prefix(strs); + println!("============={}", a); + // assert_eq!(1994, a.roman_to_int(s.to_string())); + } +} diff --git a/rustpractice/src/problem1.rs b/rustpractice/src/problem1.rs new file mode 100644 index 0000000..9815794 --- /dev/null +++ b/rustpractice/src/problem1.rs @@ -0,0 +1,56 @@ +#[cfg(test)] +pub mod problem1 { + use std::collections::HashMap; + pub struct Solution {} + + impl Solution { + pub fn two_sum(self, nums: Vec, target: i32) -> Vec { + let mut map = HashMap::new(); + let mut resultv = Vec::new(); + + for (i, v) in nums.iter().enumerate() { + let diff = target - *v; + let ta_idx = map.get(&diff); + println!("diff:{:?} ta_idx:{:?}", diff, ta_idx); + match ta_idx { + Some(tidx) => { + resultv.push(*tidx); + resultv.push(i as i32); + break; + } + None => { + map.insert(*v, i as i32); + } + } + println!("map:{:?} ", map); + } + // println!("{:?}",map); + // println!("{:?}",nums); + + // for (i,v ) in nums.iter().enumerate(){ + // let diff = target - *v; + // let ta_idx = map.get(&diff); + // println!("diff:{:?} ta_idx:{:?}", diff, ta_idx); + // match ta_idx{ + // Some(tidx) => { + // let c = i as i32; + // if c != *tidx{ + // resultv.push(c); + // resultv.push(*tidx); + // break; + // } + // }, + // None=>{} + // } + + // } + resultv + } + } + #[test] + pub fn test() { + let a = Solution {}; + let nums = vec![3, 2, 4]; + let r = a.two_sum(nums, 6); + } +}