oppgaver så langt
This commit is contained in:
parent
4f3385850f
commit
df84d4f18e
17 changed files with 628 additions and 0 deletions
6
add-binary-67/Cargo.toml
Normal file
6
add-binary-67/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "add-binary-67"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
66
add-binary-67/src/main.rs
Normal file
66
add-binary-67/src/main.rs
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
struct Solution {}
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn add_binary(a: String, b: String) -> String {
|
||||||
|
let mut result = String::new();
|
||||||
|
let mut carry = 0;
|
||||||
|
|
||||||
|
// Convert strings to character vectors and reverse them for easier processing
|
||||||
|
let a_chars: Vec<char> = a.chars().rev().collect();
|
||||||
|
let b_chars: Vec<char> = b.chars().rev().collect();
|
||||||
|
|
||||||
|
// Get the maximum length of the two strings
|
||||||
|
let max_len = std::cmp::max(a_chars.len(), b_chars.len());
|
||||||
|
|
||||||
|
// Perform binary addition digit by digit
|
||||||
|
for i in 0..max_len {
|
||||||
|
// Get digits at current position or 0 if we've reached the end
|
||||||
|
let a_digit = if i < a_chars.len() {
|
||||||
|
a_chars[i].to_digit(2).unwrap()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
let b_digit = if i < b_chars.len() {
|
||||||
|
b_chars[i].to_digit(2).unwrap()
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
// Calculate sum and new carry
|
||||||
|
let sum = a_digit + b_digit + carry;
|
||||||
|
carry = sum / 2;
|
||||||
|
let digit = sum % 2;
|
||||||
|
|
||||||
|
// Add the current digit to the result
|
||||||
|
result.push(char::from_digit(digit, 2).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Don't forget the final carry if it exists
|
||||||
|
if carry > 0 {
|
||||||
|
result.push('1');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reverse the result and return
|
||||||
|
result.chars().rev().collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
// pub fn add_binary(a: String, b: String) -> String {
|
||||||
|
// let num1 = u128::from_str_radix(a.as_str(), 2).expect("Valid binary string");
|
||||||
|
// let num2 = u128::from_str_radix(b.as_str(), 2).expect("Valid binary string");
|
||||||
|
|
||||||
|
// let sum = num1 + num2;
|
||||||
|
|
||||||
|
// let binary_sum = format!("{:b}", sum); // format as binary string
|
||||||
|
|
||||||
|
// println!("Sum in decimal: {}", sum);
|
||||||
|
// println!("Sum in binary: {}", binary_sum);
|
||||||
|
// binary_sum
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a: String = "111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111".to_string();
|
||||||
|
let b: String = "11010100101110111000111".to_string();
|
||||||
|
|
||||||
|
println!("{:?}", Solution::add_binary(a, b));
|
||||||
|
}
|
||||||
6
binary-tree-inorder-traversal-94/Cargo.toml
Normal file
6
binary-tree-inorder-traversal-94/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "binary-tree-inorder-traversal-94"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
75
binary-tree-inorder-traversal-94/src/main.rs
Normal file
75
binary-tree-inorder-traversal-94/src/main.rs
Normal file
|
|
@ -0,0 +1,75 @@
|
||||||
|
// Definition for a binary tree node.
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
pub struct TreeNode {
|
||||||
|
pub val: i32,
|
||||||
|
pub left: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
pub right: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TreeNode {
|
||||||
|
#[inline]
|
||||||
|
pub fn new(val: i32) -> Self {
|
||||||
|
TreeNode {
|
||||||
|
val,
|
||||||
|
left: None,
|
||||||
|
right: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::rc::Rc;
|
||||||
|
pub fn inorder_traversal_recursively(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
helper(&root, &mut result);
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn helper(node: &Option<Rc<RefCell<TreeNode>>>, result: &mut Vec<i32>) {
|
||||||
|
if let Some(n) = node {
|
||||||
|
let n = n.borrow();
|
||||||
|
helper(&n.left, result); // Left subtree
|
||||||
|
result.push(n.val); // Current node
|
||||||
|
helper(&n.right, result); // Right subtree
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn inorder_traversal(root: Option<Rc<RefCell<TreeNode>>>) -> Vec<i32> {
|
||||||
|
let mut result = Vec::new();
|
||||||
|
let mut stack = Vec::new();
|
||||||
|
let mut current = root;
|
||||||
|
|
||||||
|
while current.is_some() || !stack.is_empty() {
|
||||||
|
while let Some(node) = current {
|
||||||
|
stack.push(node.clone());
|
||||||
|
current = node.borrow().left.clone();
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(node) = stack.pop() {
|
||||||
|
let node = node.borrow();
|
||||||
|
result.push(node.val); // Visit current node
|
||||||
|
current = node.right.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let values = vec![
|
||||||
|
Some(1),
|
||||||
|
Some(2),
|
||||||
|
Some(3),
|
||||||
|
Some(4),
|
||||||
|
Some(5),
|
||||||
|
None,
|
||||||
|
Some(8),
|
||||||
|
None,
|
||||||
|
None,
|
||||||
|
Some(6),
|
||||||
|
Some(7),
|
||||||
|
Some(9),
|
||||||
|
];
|
||||||
|
|
||||||
|
println!("{:?}", values);
|
||||||
|
}
|
||||||
6
climbing-stairs-70/Cargo.toml
Normal file
6
climbing-stairs-70/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "climbing-stairs-70"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
37
climbing-stairs-70/src/main.rs
Normal file
37
climbing-stairs-70/src/main.rs
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
fn climb_stairs_on2(n: i32) -> i32 {
|
||||||
|
if n == 1 {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if n == 2 {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
let sol = climb_stairs(n - 2) + climb_stairs(n - 1);
|
||||||
|
|
||||||
|
sol
|
||||||
|
}
|
||||||
|
|
||||||
|
fn climb_stairs(n: i32) -> i32 {
|
||||||
|
if n == 1 {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
if n == 2 {
|
||||||
|
return 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut prev = 1;
|
||||||
|
let mut curr = 2;
|
||||||
|
|
||||||
|
for _ in 3..=n {
|
||||||
|
let next = prev + curr;
|
||||||
|
prev = curr;
|
||||||
|
curr = next;
|
||||||
|
}
|
||||||
|
|
||||||
|
curr
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("{}", climb_stairs(4));
|
||||||
|
}
|
||||||
6
merge-sorted-array-88/Cargo.toml
Normal file
6
merge-sorted-array-88/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "merge-sorted-array-88"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
83
merge-sorted-array-88/src/main.rs
Normal file
83
merge-sorted-array-88/src/main.rs
Normal file
|
|
@ -0,0 +1,83 @@
|
||||||
|
pub fn merge_hacky(nums1: &mut Vec<i32>, m: i32, nums2: &mut Vec<i32>, n: i32) {
|
||||||
|
if n == 0 {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if m == 0 {
|
||||||
|
*nums1 = nums2.clone();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut num1_counter = (m - 1) as usize;
|
||||||
|
let mut num2_counter = (n - 1) as usize;
|
||||||
|
let while_bool = true;
|
||||||
|
|
||||||
|
// Iterate nums1 from len - n (which is 3) backwards
|
||||||
|
while while_bool {
|
||||||
|
let num1 = nums1[num1_counter];
|
||||||
|
let num2 = nums2[num2_counter];
|
||||||
|
|
||||||
|
if num1 < num2 {
|
||||||
|
nums1[num1_counter + num2_counter + 1] = num2;
|
||||||
|
if num2_counter == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num2_counter -= 1;
|
||||||
|
} else if num1 > num2 {
|
||||||
|
nums1[num1_counter + num2_counter + 1] = num1;
|
||||||
|
if num1_counter == 0 {
|
||||||
|
nums1[..num2_counter + 1].copy_from_slice(&nums2[..num2_counter + 1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num1_counter -= 1
|
||||||
|
} else {
|
||||||
|
nums1[num1_counter + num2_counter] = num2;
|
||||||
|
nums1[num1_counter + num2_counter + 1] = num1;
|
||||||
|
if num2_counter == 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num2_counter -= 1;
|
||||||
|
if num1_counter == 0 {
|
||||||
|
nums1[..num2_counter + 1].copy_from_slice(&nums2[..num2_counter + 1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num1_counter -= 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn merge(nums1: &mut Vec<i32>, m: i32, nums2: &mut Vec<i32>, n: i32) {
|
||||||
|
let mut i = (m - 1) as usize;
|
||||||
|
let mut j = (n - 1) as usize;
|
||||||
|
let mut k = (m + n - 1) as usize;
|
||||||
|
|
||||||
|
while let Some(_) = nums1.get(k) {
|
||||||
|
if j == usize::MAX {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if i == usize::MAX {
|
||||||
|
nums1[..=j].copy_from_slice(&nums2[..=j]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if nums1[i] < nums2[j] {
|
||||||
|
nums1[k] = nums2[j];
|
||||||
|
j = j.wrapping_sub(1);
|
||||||
|
} else {
|
||||||
|
nums1[k] = nums1[i];
|
||||||
|
i = i.wrapping_sub(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
k = k.wrapping_sub(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut nums1 = vec![2, 0];
|
||||||
|
let m = 1;
|
||||||
|
let mut nums2 = vec![1];
|
||||||
|
let n = 1;
|
||||||
|
println!("{:?}", merge(&mut nums1, m, &mut nums2, n));
|
||||||
|
println!("{:?}", nums1)
|
||||||
|
}
|
||||||
6
plus-one-66/Cargo.toml
Normal file
6
plus-one-66/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "plus-one-66"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
21
plus-one-66/src/main.rs
Normal file
21
plus-one-66/src/main.rs
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
struct Solution {}
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn plus_one(mut digits: Vec<i32>) -> Vec<i32> {
|
||||||
|
for val in digits.iter_mut().rev() {
|
||||||
|
if *val == 9 {
|
||||||
|
*val = 0;
|
||||||
|
} else {
|
||||||
|
*val += 1;
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
digits.insert(0, 1);
|
||||||
|
digits
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let digits = vec![9, 9, 8];
|
||||||
|
println!("{:#?}", Solution::plus_one(digits));
|
||||||
|
}
|
||||||
6
remove-duplicates-from-sorted-list-83/Cargo.toml
Normal file
6
remove-duplicates-from-sorted-list-83/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "remove-duplicates-from-sorted-list-83"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
51
remove-duplicates-from-sorted-list-83/src/main.rs
Normal file
51
remove-duplicates-from-sorted-list-83/src/main.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
// Definition for singly-linked list.
|
||||||
|
#[derive(PartialEq, Eq, Clone, Debug)]
|
||||||
|
pub struct ListNode {
|
||||||
|
pub val: i32,
|
||||||
|
pub next: Option<Box<ListNode>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ListNode {
|
||||||
|
#[inline]
|
||||||
|
fn new(val: i32) -> Self {
|
||||||
|
ListNode { next: None, val }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_linked_list(values: &[i32]) -> Option<Box<ListNode>> {
|
||||||
|
let mut head = None;
|
||||||
|
let mut current = &mut head;
|
||||||
|
|
||||||
|
for &val in values {
|
||||||
|
*current = Some(Box::new(ListNode::new(val)));
|
||||||
|
current = &mut current.as_mut().unwrap().next;
|
||||||
|
}
|
||||||
|
|
||||||
|
head
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn delete_duplicates(mut head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
|
||||||
|
let mut current = head.as_mut();
|
||||||
|
|
||||||
|
while let Some(node) = current {
|
||||||
|
while let Some(next) = node.next.as_mut() {
|
||||||
|
// Mutably borrow next
|
||||||
|
if node.val == next.val {
|
||||||
|
node.next = next.next.take(); // Take ownership of the next node safely
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
current = node.next.as_mut(); // Move to the next distinct node
|
||||||
|
}
|
||||||
|
|
||||||
|
head
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let values = [1, 2, 3, 3, 4];
|
||||||
|
let head = to_linked_list(&values);
|
||||||
|
println!("{:?}", head);
|
||||||
|
println!("{:?}", delete_duplicates(head));
|
||||||
|
|
||||||
|
}
|
||||||
6
remove_duplicates/Cargo.toml
Normal file
6
remove_duplicates/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "remove_duplicates"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
6
same-tree-100/Cargo.toml
Normal file
6
same-tree-100/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "same-tree-100"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
181
same-tree-100/src/main.rs
Normal file
181
same-tree-100/src/main.rs
Normal file
|
|
@ -0,0 +1,181 @@
|
||||||
|
// Definition for a binary tree node.
|
||||||
|
#[derive(Debug, PartialEq, Eq)]
|
||||||
|
pub struct TreeNode {
|
||||||
|
pub val: i32,
|
||||||
|
pub left: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
pub right: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TreeNode {
|
||||||
|
#[inline]
|
||||||
|
pub fn new(val: i32) -> Self {
|
||||||
|
TreeNode {
|
||||||
|
val,
|
||||||
|
left: None,
|
||||||
|
right: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
struct Solution {}
|
||||||
|
|
||||||
|
use std::cell::RefCell;
|
||||||
|
use std::rc::Rc;
|
||||||
|
impl Solution {
|
||||||
|
pub fn is_same_tree(
|
||||||
|
p: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
q: Option<Rc<RefCell<TreeNode>>>,
|
||||||
|
) -> bool {
|
||||||
|
// Base cases: if either is None
|
||||||
|
match (p, q) {
|
||||||
|
// Both are None - trees are identical (empty)
|
||||||
|
(None, None) => true,
|
||||||
|
|
||||||
|
// One is None but the other isn't - trees are different
|
||||||
|
(Some(_), None) | (None, Some(_)) => false,
|
||||||
|
|
||||||
|
// Both trees have nodes - compare them recursively
|
||||||
|
(Some(p_node), Some(q_node)) => {
|
||||||
|
let p_borrow = p_node.borrow();
|
||||||
|
let q_borrow = q_node.borrow();
|
||||||
|
|
||||||
|
// Trees are the same if:
|
||||||
|
// 1. Current nodes have the same value
|
||||||
|
// 2. Left subtrees are the same
|
||||||
|
// 3. Right subtrees are the same
|
||||||
|
p_borrow.val == q_borrow.val
|
||||||
|
&& Solution::is_same_tree(p_borrow.left.clone(), q_borrow.left.clone())
|
||||||
|
&& Solution::is_same_tree(p_borrow.right.clone(), q_borrow.right.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_same_tree_iterativly(p: Option<Rc<RefCell<TreeNode>>>, q: Option<Rc<RefCell<TreeNode>>>) -> bool {
|
||||||
|
// Create a stack to store pairs of nodes to compare
|
||||||
|
let mut stack = Vec::new();
|
||||||
|
|
||||||
|
// Push the root pair to the stack
|
||||||
|
stack.push((p, q));
|
||||||
|
|
||||||
|
// Process nodes until the stack is empty
|
||||||
|
while !stack.is_empty() {
|
||||||
|
if let Some((p_opt, q_opt)) = stack.pop() {
|
||||||
|
match (p_opt, q_opt) {
|
||||||
|
// Both nodes are None, continue checking other pairs
|
||||||
|
(None, None) => continue,
|
||||||
|
|
||||||
|
// One node is None while the other isn't - trees differ
|
||||||
|
(Some(_), None) | (None, Some(_)) => return false,
|
||||||
|
|
||||||
|
// Both nodes exist, compare them
|
||||||
|
(Some(p_node), Some(q_node)) => {
|
||||||
|
let p_borrow = p_node.borrow();
|
||||||
|
let q_borrow = q_node.borrow();
|
||||||
|
|
||||||
|
// If values are different, trees differ
|
||||||
|
if p_borrow.val != q_borrow.val {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Push right children to stack
|
||||||
|
stack.push((
|
||||||
|
p_borrow.right.clone(),
|
||||||
|
q_borrow.right.clone()
|
||||||
|
));
|
||||||
|
|
||||||
|
// Push left children to stack
|
||||||
|
stack.push((
|
||||||
|
p_borrow.left.clone(),
|
||||||
|
q_borrow.left.clone()
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we've processed all nodes without finding differences, trees are identical
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to create trees from arrays
|
||||||
|
fn create_tree_from_vec(nums: &[Option<i32>], index: usize) -> Option<Rc<RefCell<TreeNode>>> {
|
||||||
|
if index >= nums.len() || nums[index].is_none() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let val = nums[index].unwrap();
|
||||||
|
let mut node = TreeNode::new(val);
|
||||||
|
|
||||||
|
// Create left child (2*index + 1)
|
||||||
|
node.left = create_tree_from_vec(nums, 2 * index + 1);
|
||||||
|
|
||||||
|
// Create right child (2*index + 2)
|
||||||
|
node.right = create_tree_from_vec(nums, 2 * index + 2);
|
||||||
|
|
||||||
|
Some(Rc::new(RefCell::new(node)))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// Test case 1: Two identical trees
|
||||||
|
// 1
|
||||||
|
// / \
|
||||||
|
// 2 3
|
||||||
|
let tree1_data = vec![Some(1), Some(2), Some(3)];
|
||||||
|
let tree1 = create_tree_from_vec(&tree1_data, 0);
|
||||||
|
let tree2 = create_tree_from_vec(&tree1_data, 0);
|
||||||
|
|
||||||
|
// Expected: true
|
||||||
|
println!("Test case 1: {}", is_same_tree_iterativly(tree1, tree2));
|
||||||
|
|
||||||
|
// Test case 2: Different values in nodes
|
||||||
|
// 1 1
|
||||||
|
// / \ / \
|
||||||
|
// 2 3 2 4
|
||||||
|
let tree3_data = vec![Some(1), Some(2), Some(3)];
|
||||||
|
let tree4_data = vec![Some(1), Some(2), Some(4)];
|
||||||
|
let tree3 = create_tree_from_vec(&tree3_data, 0);
|
||||||
|
let tree4 = create_tree_from_vec(&tree4_data, 0);
|
||||||
|
|
||||||
|
// Expected: false
|
||||||
|
println!("Test case 2: {}", Solution::is_same_tree(tree3, tree4));
|
||||||
|
|
||||||
|
// Test case 3: Different structure
|
||||||
|
// 1 1
|
||||||
|
// / \ \
|
||||||
|
// 2 3 3
|
||||||
|
let tree5_data = vec![Some(1), Some(2), Some(3)];
|
||||||
|
let tree6_data = vec![Some(1), None, Some(3)];
|
||||||
|
let tree5 = create_tree_from_vec(&tree5_data, 0);
|
||||||
|
let tree6 = create_tree_from_vec(&tree6_data, 0);
|
||||||
|
|
||||||
|
// Expected: false
|
||||||
|
println!("Test case 3: {}", Solution::is_same_tree(tree5, tree6));
|
||||||
|
|
||||||
|
// Test case 4: Empty trees
|
||||||
|
let tree7: Option<Rc<RefCell<TreeNode>>> = None;
|
||||||
|
let tree8: Option<Rc<RefCell<TreeNode>>> = None;
|
||||||
|
|
||||||
|
// Expected: true
|
||||||
|
println!("Test case 4: {}", Solution::is_same_tree(tree7, tree8));
|
||||||
|
|
||||||
|
// Test case 5: One empty, one not
|
||||||
|
let tree9_data = vec![Some(1)];
|
||||||
|
let tree9 = create_tree_from_vec(&tree9_data, 0);
|
||||||
|
let tree10: Option<Rc<RefCell<TreeNode>>> = None;
|
||||||
|
|
||||||
|
// Expected: false
|
||||||
|
println!("Test case 5: {}", Solution::is_same_tree(tree9, tree10));
|
||||||
|
|
||||||
|
// Test case 6: More complex identical trees
|
||||||
|
// 1
|
||||||
|
// / \
|
||||||
|
// 2 3
|
||||||
|
// / \
|
||||||
|
// 4 5
|
||||||
|
let tree11_data = vec![Some(1), Some(2), Some(3), Some(4), None, None, Some(5)];
|
||||||
|
let tree11 = create_tree_from_vec(&tree11_data, 0);
|
||||||
|
let tree12 = create_tree_from_vec(&tree11_data, 0);
|
||||||
|
|
||||||
|
// Expected: true
|
||||||
|
println!("Test case 6: {}", Solution::is_same_tree(tree11, tree12));
|
||||||
|
}
|
||||||
6
sqrtx-69/Cargo.toml
Normal file
6
sqrtx-69/Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "sqrtx-69"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
60
sqrtx-69/src/main.rs
Normal file
60
sqrtx-69/src/main.rs
Normal file
|
|
@ -0,0 +1,60 @@
|
||||||
|
// fn my_sqrt(x: i32) -> i32 {
|
||||||
|
// let mut upper_range = x / 2;
|
||||||
|
// let mut last_i = 0;
|
||||||
|
|
||||||
|
// if x <= 5 {
|
||||||
|
// upper_range = x;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// if x >= i32::MAX {
|
||||||
|
// return (i32::MAX as f64).sqrt().floor() as i32;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// for i in 0..=upper_range {
|
||||||
|
// let power_of_2 = i * i;
|
||||||
|
|
||||||
|
// if power_of_2 == x {
|
||||||
|
// return i;
|
||||||
|
// } else if power_of_2 > x {
|
||||||
|
// return last_i;
|
||||||
|
// } else {
|
||||||
|
// last_i = i;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// 0
|
||||||
|
// }
|
||||||
|
|
||||||
|
fn my_sqrt(x: i32) -> i32 {
|
||||||
|
if x < 2 {
|
||||||
|
return x; // Early return for 0 and 1
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut right = 46340.min(x / 2);
|
||||||
|
|
||||||
|
if x >= right * right {
|
||||||
|
return right;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut left = 2;
|
||||||
|
|
||||||
|
while left <= right {
|
||||||
|
let mid = left + (right - left) / 2;
|
||||||
|
let mid_squared = mid * mid;
|
||||||
|
|
||||||
|
if mid_squared == x {
|
||||||
|
return mid;
|
||||||
|
} else if mid_squared < x {
|
||||||
|
left = mid + 1;
|
||||||
|
} else {
|
||||||
|
right = mid - 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
right // After the loop, `right` is the largest value whose square is <= x}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
// let sol = my_sqrt(2147483647);
|
||||||
|
let sol = my_sqrt(2147395599);
|
||||||
|
println!("{}", sol);
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue