Skip to content

Commit 0758b82

Browse files
committed
Initial Checkin - Finished Delete Duplicates
0 parents  commit 0758b82

9 files changed

+483
-0
lines changed

Diff for: .gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
/target
2+
/Cargo.lock

Diff for: Cargo.toml

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[package]
2+
name = "rust-leetcode"
3+
version = "0.1.0"
4+
edition = "2021"
5+
6+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
7+
8+
[dependencies]

Diff for: src/add_two_numbers.rs

+105
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
use crate::list_node::ListNode;
2+
3+
/// You are given two non-empty linked lists representing two non-negative
4+
/// integers. The digits are stored in reverse order, and each of their nodes
5+
/// contains a single digit. Add the two numbers and return the sum as a linked
6+
/// list.
7+
///
8+
/// You may assume the two numbers do not contain any leading zero, except the
9+
/// number 0 itself.
10+
struct Solution;
11+
12+
impl Solution {
13+
14+
fn add_values(val1: i32, val2: i32, overflow: bool) -> (i32, bool) {
15+
let mut sum = val1 + val2;
16+
if overflow {
17+
sum += 1;
18+
}
19+
20+
if sum >= 10 {
21+
(sum - 10, true)
22+
} else {
23+
(sum, false)
24+
}
25+
}
26+
27+
pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
28+
let mut l1 = l1;
29+
let mut l2 = l2;
30+
31+
let mut result = None;
32+
let mut current = &mut result;
33+
34+
let mut overflow = false;
35+
36+
loop {
37+
match (l1, l2) {
38+
(None, None) => {
39+
let (sum, _) = Self::add_values(0, 0, overflow);
40+
if sum > 0 {
41+
let node = Some(Box::new(ListNode::new(sum)));
42+
if current.as_mut().is_none() {
43+
result = node;
44+
} else {
45+
current.as_mut().unwrap().next = node;
46+
}
47+
}
48+
49+
break;
50+
}
51+
(node1, node2) => {
52+
let val1 = node1.as_ref().map(|n1| n1.val).unwrap_or(0);
53+
let val2 = node2.as_ref().map(|n2| n2.val).unwrap_or(0);
54+
55+
let (sum, carry) = Self::add_values(val1, val2, overflow);
56+
overflow = carry;
57+
58+
let node = Some(Box::new(ListNode::new(sum)));
59+
if current.as_mut().is_none() {
60+
result = node;
61+
current = &mut result;
62+
} else {
63+
current.as_mut().unwrap().next = node;
64+
current = &mut current.as_mut().unwrap().next;
65+
}
66+
67+
l1 = node1.and_then(|n1| n1.next);
68+
l2 = node2.and_then(|n2| n2.next);
69+
}
70+
}
71+
}
72+
result
73+
}
74+
}
75+
76+
#[cfg(test)]
77+
mod tests {
78+
use crate::list_node::ListNode;
79+
use super::Solution;
80+
81+
#[test]
82+
fn example_1() {
83+
let l1 = ListNode::from_vec(vec![2, 4, 3]);
84+
let l2 = ListNode::from_vec(vec![5, 6, 4]);
85+
let result = Solution::add_two_numbers(l1, l2);
86+
assert_eq!(ListNode::to_vec(result), vec![7, 0, 8]);
87+
}
88+
89+
#[test]
90+
fn example_2() {
91+
let l1 = ListNode::from_vec(vec![0]);
92+
let l2 = ListNode::from_vec(vec![0]);
93+
let result = Solution::add_two_numbers(l1, l2);
94+
assert_eq!(ListNode::to_vec(result), vec![0]);
95+
}
96+
97+
#[test]
98+
fn example_3() {
99+
let l1 = ListNode::from_vec(vec![9,9,9,9,9,9,9]);
100+
let l2 = ListNode::from_vec(vec![9,9,9,9]);
101+
let result = Solution::add_two_numbers(l1, l2);
102+
assert_eq!(ListNode::to_vec(result), vec![8,9,9,9,0,0,0,1]);
103+
}
104+
105+
}

Diff for: src/length_of_longest_substring.rs

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
use std::collections::HashSet;
2+
3+
/// Given a string `s`, find the length of the longest substring without repeating
4+
/// characters.
5+
pub struct Solution;
6+
7+
impl Solution {
8+
pub fn length_of_longest_substring(s: String) -> i32 {
9+
let letters: Vec<char> = s.chars().collect();
10+
let mut items: HashSet<char> = HashSet::new();
11+
12+
let mut max = 0;
13+
let mut current = 0;
14+
let mut left: usize = 0;
15+
16+
for letter in letters.iter() {
17+
if items.contains(&letter) {
18+
while letters[left] != *letter {
19+
items.remove(&letters[left]);
20+
current -= 1;
21+
left += 1;
22+
}
23+
left += 1;
24+
} else {
25+
items.insert(*letter);
26+
current += 1;
27+
if current > max {
28+
max = current;
29+
}
30+
}
31+
}
32+
33+
max
34+
}
35+
}
36+
37+
#[cfg(test)]
38+
mod tests {
39+
use super::Solution;
40+
41+
#[test]
42+
fn example_1() {
43+
let result = Solution::length_of_longest_substring("abcabcbb".to_string());
44+
assert_eq!(result, 3);
45+
}
46+
47+
#[test]
48+
fn example_2() {
49+
let result = Solution::length_of_longest_substring("bbbbb".to_string());
50+
assert_eq!(result, 1);
51+
}
52+
53+
#[test]
54+
fn example_3() {
55+
let result = Solution::length_of_longest_substring("pwwkew".to_string());
56+
assert_eq!(result, 3);
57+
}
58+
}

Diff for: src/lib.rs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#![allow(dead_code)]
2+
#![allow(unused_imports)]
3+
4+
pub mod list_node;
5+
6+
pub mod two_sum; // 1
7+
pub mod add_two_numbers; // 2
8+
pub mod length_of_longest_substring; // 3
9+
pub mod median_of_two_sorted_arrays; // 4
10+
11+
pub mod remove_duplicates_from_sorted_list;

Diff for: src/list_node.rs

+112
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
use std::iter::FromIterator;
2+
3+
#[derive(PartialEq, Eq, Clone, Debug)]
4+
pub struct ListNode {
5+
pub val: i32,
6+
pub next: Option<Box<ListNode>>
7+
}
8+
9+
impl ListNode {
10+
#[inline]
11+
pub fn new(val: i32) -> Self {
12+
ListNode {
13+
next: None,
14+
val
15+
}
16+
}
17+
18+
pub fn with_next(val: i32, next: Option<Box<ListNode>>) -> Self {
19+
ListNode { val, next }
20+
}
21+
22+
pub fn from_vec(items: Vec<i32>) -> Option<Box<ListNode>> {
23+
if items.len() == 0 {
24+
None
25+
} else {
26+
let mut result = Some(Box::new(ListNode::new(items[0])));
27+
let mut current = &mut result;
28+
29+
for i in 1..items.len() {
30+
let node = Some(Box::new(ListNode::new(items[i])));
31+
32+
current.as_mut().map(|cnode| {
33+
cnode.next = node;
34+
});
35+
current = &mut current.as_mut().unwrap().next;
36+
37+
}
38+
39+
result
40+
}
41+
}
42+
43+
pub fn to_vec(nodes: Option<Box<ListNode>>) -> Vec<i32> {
44+
let mut nodes = nodes;
45+
let mut result = vec![];
46+
let mut current = &mut nodes;
47+
48+
while let Some(box_node) = current {
49+
result.push(box_node.val);
50+
current = &mut current.as_mut().unwrap().next;
51+
}
52+
53+
result
54+
}
55+
56+
}
57+
58+
#[cfg(test)]
59+
mod tests {
60+
use super::*;
61+
62+
#[test]
63+
fn with_next() {
64+
let one_a = ListNode::new(1);
65+
let two_a = ListNode::with_next(2, Some(Box::new(one_a)));
66+
67+
let one_b = ListNode::new(1);
68+
let two_b = ListNode { val: 2, next: Some(Box::new(one_b)) };
69+
70+
assert_eq!(two_a, two_b);
71+
}
72+
73+
#[test]
74+
fn empty_list() {
75+
let result = ListNode::from_vec(vec![]);
76+
assert_eq!(result, None);
77+
}
78+
79+
#[test]
80+
fn one_item_list() {
81+
let result = ListNode::from_vec(vec![1]);
82+
assert_eq!(result, Some(Box::new(ListNode::new(1))));
83+
}
84+
85+
#[test]
86+
fn two_item_list() {
87+
let result = ListNode::from_vec(vec![3, 4]);
88+
let four = Some(Box::new(ListNode::new(4)));
89+
let three = Some(Box::new(ListNode { val: 3, next: four }));
90+
assert_eq!(result, three);
91+
}
92+
93+
#[test]
94+
fn three_item_list() {
95+
let result = ListNode::from_vec(vec![1, 3, 5]);
96+
let five = ListNode::new(5);
97+
let three = ListNode::with_next(3, Some(Box::new(five)));
98+
let one = ListNode::with_next(1, Some(Box::new(three)));
99+
100+
assert_eq!(result, Some(Box::new(one)));
101+
}
102+
103+
#[test]
104+
fn vec_to_nodes_to_vec() {
105+
let items = vec![1,3,5,7,9,2,4,6,8,10];
106+
let nodes = ListNode::from_vec(items);
107+
let result = ListNode::to_vec(nodes);
108+
109+
assert_eq!(result, vec![1,3,5,7,9,2,4,6,8,10]);
110+
}
111+
112+
}

Diff for: src/median_of_two_sorted_arrays.rs

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/// Given two sorted arrays `nums` and `nums2` of size `m` and `n`
2+
/// respectively, return the median of the two sorted arrays.
3+
///
4+
/// The overall run time complexity should be O(log (m+n)).
5+
pub struct Solution;
6+
7+
impl Solution {
8+
9+
// TODO: Implement
10+
pub fn find_median_sorted_arrays(_nums1: Vec<i32>, _nums2: Vec<i32>) -> f64 {
11+
0.0
12+
}
13+
14+
}
15+
16+
#[cfg(test)]
17+
mod tests {
18+
use super::Solution;
19+
20+
#[ignore] #[test]
21+
fn example_1() {
22+
let result = Solution::find_median_sorted_arrays(vec![1, 3], vec![2]);
23+
assert_eq!(result, 2.0);
24+
}
25+
26+
#[ignore] #[test]
27+
fn example_2() {
28+
let result = Solution::find_median_sorted_arrays(vec![1, 2], vec![3, 4]);
29+
assert_eq!(result, 2.5);
30+
}
31+
32+
}

0 commit comments

Comments
 (0)