Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added 1.test
Empty file.
128 changes: 72 additions & 56 deletions exercises/algorithm/algorithm1.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,7 @@
/*
single linked list merge
This problem requires you to merge two ordered singly linked lists into one ordered singly linked list
single linked list merge
This problem requires you to merge two ordered singly linked lists into one ordered singly linked list
*/
// I AM NOT DONE

use std::fmt::{self, Display, Formatter};
use std::ptr::NonNull;
use std::vec::*;
Expand All @@ -16,10 +14,7 @@ struct Node<T> {

impl<T> Node<T> {
fn new(t: T) -> Node<T> {
Node {
val: t,
next: None,
}
Node { val: t, next: None }
}
}
#[derive(Debug)]
Expand Down Expand Up @@ -69,15 +64,36 @@ impl<T> LinkedList<T> {
},
}
}
pub fn merge(list_a:LinkedList<T>,list_b:LinkedList<T>) -> Self
{
//TODO
Self {
length: 0,
start: None,
end: None,
pub fn merge(mut list_a: LinkedList<T>, mut list_b: LinkedList<T>) -> Self
where
T: Ord + Clone,
{
let mut merged = LinkedList::new();
let mut idx_a = 0;
let mut idx_b = 0;
while idx_a < list_a.length as i32 && idx_b < list_b.length as i32 {
let a_val = list_a.get(idx_a).unwrap();
let b_val = list_b.get(idx_b).unwrap();
if a_val <= b_val {
merged.add((*a_val).clone());
idx_a += 1;
} else {
merged.add((*b_val).clone());
idx_b += 1;
}
}
}
while idx_a < list_a.length as i32 {
let a_val = list_a.get(idx_a).unwrap();
merged.add((*a_val).clone());
idx_a += 1;
}
while idx_b < list_b.length as i32 {
let b_val = list_b.get(idx_b).unwrap();
merged.add((*b_val).clone());
idx_b += 1;
}
merged
}
}

impl<T> Display for LinkedList<T>
Expand Down Expand Up @@ -130,44 +146,44 @@ mod tests {

#[test]
fn test_merge_linked_list_1() {
let mut list_a = LinkedList::<i32>::new();
let mut list_b = LinkedList::<i32>::new();
let vec_a = vec![1,3,5,7];
let vec_b = vec![2,4,6,8];
let target_vec = vec![1,2,3,4,5,6,7,8];

for i in 0..vec_a.len(){
list_a.add(vec_a[i]);
}
for i in 0..vec_b.len(){
list_b.add(vec_b[i]);
}
println!("list a {} list b {}", list_a,list_b);
let mut list_c = LinkedList::<i32>::merge(list_a,list_b);
println!("merged List is {}", list_c);
for i in 0..target_vec.len(){
assert_eq!(target_vec[i],*list_c.get(i as i32).unwrap());
}
}
#[test]
fn test_merge_linked_list_2() {
let mut list_a = LinkedList::<i32>::new();
let mut list_b = LinkedList::<i32>::new();
let vec_a = vec![11,33,44,88,89,90,100];
let vec_b = vec![1,22,30,45];
let target_vec = vec![1,11,22,30,33,44,45,88,89,90,100];
let mut list_a = LinkedList::<i32>::new();
let mut list_b = LinkedList::<i32>::new();
let vec_a = vec![1, 3, 5, 7];
let vec_b = vec![2, 4, 6, 8];
let target_vec = vec![1, 2, 3, 4, 5, 6, 7, 8];

for i in 0..vec_a.len(){
list_a.add(vec_a[i]);
}
for i in 0..vec_b.len(){
list_b.add(vec_b[i]);
}
println!("list a {} list b {}", list_a,list_b);
let mut list_c = LinkedList::<i32>::merge(list_a,list_b);
println!("merged List is {}", list_c);
for i in 0..target_vec.len(){
assert_eq!(target_vec[i],*list_c.get(i as i32).unwrap());
}
}
}
for i in 0..vec_a.len() {
list_a.add(vec_a[i]);
}
for i in 0..vec_b.len() {
list_b.add(vec_b[i]);
}
println!("list a {} list b {}", list_a, list_b);
let mut list_c = LinkedList::<i32>::merge(list_a, list_b);
println!("merged List is {}", list_c);
for i in 0..target_vec.len() {
assert_eq!(target_vec[i], *list_c.get(i as i32).unwrap());
}
}
#[test]
fn test_merge_linked_list_2() {
let mut list_a = LinkedList::<i32>::new();
let mut list_b = LinkedList::<i32>::new();
let vec_a = vec![11, 33, 44, 88, 89, 90, 100];
let vec_b = vec![1, 22, 30, 45];
let target_vec = vec![1, 11, 22, 30, 33, 44, 45, 88, 89, 90, 100];

for i in 0..vec_a.len() {
list_a.add(vec_a[i]);
}
for i in 0..vec_b.len() {
list_b.add(vec_b[i]);
}
println!("list a {} list b {}", list_a, list_b);
let mut list_c = LinkedList::<i32>::merge(list_a, list_b);
println!("merged List is {}", list_c);
for i in 0..target_vec.len() {
assert_eq!(target_vec[i], *list_c.get(i as i32).unwrap());
}
}
}
41 changes: 35 additions & 6 deletions exercises/algorithm/algorithm10.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@
graph
This problem requires you to implement a basic graph functio
*/
// I AM NOT DONE

use std::collections::{HashMap, HashSet};
use std::fmt;
#[derive(Debug, Clone)]
Expand All @@ -29,19 +27,50 @@ impl Graph for UndirectedGraph {
&self.adjacency_table
}
fn add_edge(&mut self, edge: (&str, &str, i32)) {
//TODO
let (from, to, weight) = edge;
self.add_node(from);
self.add_node(to);

{
let table = self.adjacency_table_mutable();
if let Some(neighbors) = table.get_mut(from) {
neighbors.push((to.to_string(), weight));
}
}

{
let table = self.adjacency_table_mutable();
if let Some(neighbors) = table.get_mut(to) {
neighbors.push((from.to_string(), weight));
}
}
}
}
pub trait Graph {
fn new() -> Self;
fn adjacency_table_mutable(&mut self) -> &mut HashMap<String, Vec<(String, i32)>>;
fn adjacency_table(&self) -> &HashMap<String, Vec<(String, i32)>>;
fn add_node(&mut self, node: &str) -> bool {
//TODO
true
if self.contains(node) {
false
} else {
self
.adjacency_table_mutable()
.insert(node.to_string(), Vec::new());
true
}
}
fn add_edge(&mut self, edge: (&str, &str, i32)) {
//TODO
let (from, to, weight) = edge;
if !self.contains(from) {
self.add_node(from);
}
if !self.contains(to) {
self.add_node(to);
}
if let Some(neighbors) = self.adjacency_table_mutable().get_mut(from) {
neighbors.push((to.to_string(), weight));
}
}
fn contains(&self, node: &str) -> bool {
self.adjacency_table().get(node).is_some()
Expand Down
81 changes: 44 additions & 37 deletions exercises/algorithm/algorithm2.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,9 @@
/*
double linked list reverse
This problem requires you to reverse a doubly linked list
double linked list reverse
This problem requires you to reverse a doubly linked list
*/
// I AM NOT DONE

use std::fmt::{self, Display, Formatter};
use std::ptr::NonNull;
use std::vec::*;

#[derive(Debug)]
struct Node<T> {
Expand Down Expand Up @@ -72,9 +69,19 @@ impl<T> LinkedList<T> {
},
}
}
pub fn reverse(&mut self){
// TODO
}
pub fn reverse(&mut self) {
let mut current = self.start;
while let Some(mut node_ptr) = current {
unsafe {
let node = node_ptr.as_mut();
let next = node.next;
node.next = node.prev;
node.prev = next;
current = next;
}
}
core::mem::swap(&mut self.start, &mut self.end);
}
}

impl<T> Display for LinkedList<T>
Expand Down Expand Up @@ -127,33 +134,33 @@ mod tests {

#[test]
fn test_reverse_linked_list_1() {
let mut list = LinkedList::<i32>::new();
let original_vec = vec![2,3,5,11,9,7];
let reverse_vec = vec![7,9,11,5,3,2];
for i in 0..original_vec.len(){
list.add(original_vec[i]);
}
println!("Linked List is {}", list);
list.reverse();
println!("Reversed Linked List is {}", list);
for i in 0..original_vec.len(){
assert_eq!(reverse_vec[i],*list.get(i as i32).unwrap());
}
}
let mut list = LinkedList::<i32>::new();
let original_vec = vec![2, 3, 5, 11, 9, 7];
let reverse_vec = vec![7, 9, 11, 5, 3, 2];
for i in 0..original_vec.len() {
list.add(original_vec[i]);
}
println!("Linked List is {}", list);
list.reverse();
println!("Reversed Linked List is {}", list);
for i in 0..original_vec.len() {
assert_eq!(reverse_vec[i], *list.get(i as i32).unwrap());
}
}

#[test]
fn test_reverse_linked_list_2() {
let mut list = LinkedList::<i32>::new();
let original_vec = vec![34,56,78,25,90,10,19,34,21,45];
let reverse_vec = vec![45,21,34,19,10,90,25,78,56,34];
for i in 0..original_vec.len(){
list.add(original_vec[i]);
}
println!("Linked List is {}", list);
list.reverse();
println!("Reversed Linked List is {}", list);
for i in 0..original_vec.len(){
assert_eq!(reverse_vec[i],*list.get(i as i32).unwrap());
}
}
}
#[test]
fn test_reverse_linked_list_2() {
let mut list = LinkedList::<i32>::new();
let original_vec = vec![34, 56, 78, 25, 90, 10, 19, 34, 21, 45];
let reverse_vec = vec![45, 21, 34, 19, 10, 90, 25, 78, 56, 34];
for i in 0..original_vec.len() {
list.add(original_vec[i]);
}
println!("Linked List is {}", list);
list.reverse();
println!("Reversed Linked List is {}", list);
for i in 0..original_vec.len() {
assert_eq!(reverse_vec[i], *list.get(i as i32).unwrap());
}
}
}
25 changes: 15 additions & 10 deletions exercises/algorithm/algorithm3.rs
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
/*
sort
This problem requires you to implement a sorting algorithm
you can use bubble sorting, insertion sorting, heap sorting, etc.
sort
This problem requires you to implement a sorting algorithm
you can use bubble sorting, insertion sorting, heap sorting, etc.
*/
// I AM NOT DONE

fn sort<T>(array: &mut [T]){
//TODO
fn sort<T: Ord>(array: &mut [T]) {
let len = array.len();
for i in 1..len {
let mut j = i;
while j > 0 && array[j - 1] > array[j] {
array.swap(j - 1, j);
j -= 1;
}
}
}
#[cfg(test)]
mod tests {
Expand All @@ -18,16 +23,16 @@ mod tests {
sort(&mut vec);
assert_eq!(vec, vec![19, 37, 46, 57, 64, 73, 75, 91]);
}
#[test]
#[test]
fn test_sort_2() {
let mut vec = vec![1];
sort(&mut vec);
assert_eq!(vec, vec![1]);
}
#[test]
#[test]
fn test_sort_3() {
let mut vec = vec![99, 88, 77, 66, 55, 44, 33, 22, 11];
sort(&mut vec);
assert_eq!(vec, vec![11, 22, 33, 44, 55, 66, 77, 88, 99]);
}
}
}
Loading