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

    }