Rust Practice Problems
Example: Given two arrays, merge and sort them. Return the resulting array.
-
fn main() {
let a = [3, 2, 5, 7];
let b = [10, 8, 6, 15, 17];
let mut c = Vec::new();
for x in a {
c.push(x);
}
for x in b {
c.push(x);
}
c.sort();
println!("{:?}", c);
}
Example: Multiply two numbers together, but these numbers can be bigger than the integer limit. Don’t use BigInteger
-
fn main() {
multiply("6", "7");
multiply("123", "456");
multiply(
"99999999999999999999999999999",
"99999999999999999999999999999",
);
multiply(
"123456789012345678901234567890",
"987654321098765432109876543210",
);
}
fn parse(s: &str) -> Vec<u8> {
let digits: Vec<u8> = s.chars()
.rev()
.map(|c| c.to_digit(10).expect("non-digit character") as u8)
.collect();
if digits.is_empty() {
return vec![0];
}
else {
return digits;
}
}
fn format_num(digits: &[u8]) -> String {
let mut most_significant = digits.len();
while most_significant > 1 && digits[most_significant - 1] == 0 {
most_significant -= 1;
}
let mut s = String::new();
let mut i = most_significant;
while i > 0 {
i -= 1;
let digit = digits[i];
let character = (b'0' + digit) as char;
s.push(character);
}
if s.is_empty() {
s.push('0');
}
s
}
fn multiply(a: &str, b: &str) -> String {
let digits_a = parse(a);
let digits_b = parse(b);
let mut partial_products: Vec<Vec<u8>> = Vec::new();
for b_pos in 0..digits_b.len() {
let b_digit = digits_b[b_pos];
let mut row: Vec<u8> = Vec::new();
for in 0..bpos {
row.push(0);
}
let mut carry = 0u16;
for a_pos in 0..digits_a.len() {
let a_digit = digits_a[a_pos];
let product = a_digit as u16 * b_digit as u16 + carry;
row.push((product % 10) as u8);
carry = product / 10;
}
if carry > 0 {
row.push(carry as u8);
}
partial_products.push(row);
}
let mut max_len = 0;
for row in &partial_products {
if row.len() > max_len {
max_len = row.len();
}
}
let mut totals: Vec<u64> = vec![0; max_len + 1];
for i in 0..partial_products.len() {
let row = &partial_products[i];
for j in 0..row.len() {
totals[j] += row[j] as u64;
}
}
for i in 0..totals.len() - 1 {
if totals[i] >= 10 {
totals[i + 1] += totals[i] / 10;
totals[i] %= 10;
}
}
let mut result_digits: Vec<u8> = Vec::new();
for i in 0..totals.len() {
result_digits.push(totals[i] as u8);
}
let result = format_num(&result_digits);
println!("{}", result);
result
}