Skip to main content
Back to problems
#273
Hard Algorithms

Integer to english words

Math String Recursion
34.8% acceptance
Jan 12, 2026
3837
6834
Convert a non-negative integer num to its English words representation.

Solution

Rust
Time O(2^n)
Space O(n)
LeetCode
solution.rs
impl Solution {
  pub fn number_to_words(num: i32) -> String {
    if num == 0 {
      return "Zero".to_string();
    }
    
    let ones = vec!["", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"];
    let teens = vec!["Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"];
    let tens = vec!["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"];
    let thousands = vec!["", "Thousand", "Million", "Billion"];
    
    fn helper(num: i32, ones: &[&str], teens: &[&str], tens: &[&str]) -> String {
      if num == 0 {
        return String::new();
      } else if num < 10 {
        return ones[num as usize].to_string();
      } else if num < 20 {
        return teens[(num - 10) as usize].to_string();
      } else if num < 100 {
        let ten = num / 10;
        let one = num % 10;
        let mut result = tens[ten as usize].to_string();
        if one > 0 {
          result.push(' ');
          result.push_str(ones[one as usize]);
        }
        return result;
      } else {
        let hundred = num / 100;
        let rest = num % 100;
        let mut result = ones[hundred as usize].to_string();
        result.push_str(" Hundred");
        if rest > 0 {
          result.push(' ');
          result.push_str(&helper(rest, ones, teens, tens));
        }
        return result;
      }
    }
    
    let mut result = Vec::new();
    let mut num = num;
    let mut group = 0;
    
    while num > 0 {
      if num % 1000 != 0 {
        let part = helper(num % 1000, &ones, &teens, &tens);
        if !thousands[group].is_empty() {
          result.push(format!("{} {}", part, thousands[group]));
        } else {
          result.push(part);
        }
      }
      num /= 1000;
      group += 1;
    }
    
    result.reverse();
    result.join(" ")
  }
}