【程序员面试金典】面试题 16.08. 整数的英语表示

【程序员面试金典】面试题 16.08. 整数的英语表示

    • 题目描述
    • 解题思路

题目描述

描述:给定一个整数,打印该整数的英文描述。

示例 1:

输入: 123
输出: "One Hundred Twenty Three"

示例 2:

输入: 12345
输出: "Twelve Thousand Three Hundred Forty Five"

示例 3:

输入: 1234567
输出: "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"

示例 4:

输入: 1234567891
输出: "One Billion Two Hundred Thirty Four Million Five Hundred Sixty Seven Thousand Eight Hundred Ninety One"

注意:本题与 273 题相同:https://leetcode-cn.com/problems/integer-to-english-words/

解题思路

思路1:最直观的想法是,模拟。英语表示整数均是三位一分割三位一分割的,既然这样,那么我们可以将个位表示、十几表示、几十表示以及三位千、六位百万、九位十亿均分别使用字符串数组存储起来,并在存储时将字符串表示与下标对应起来,方便后续检索,比如n<10则Digits[n]=n,n<20则Teens[n-10]=n,n<100则Tens[n/10]=n;然后再从高位到低位三位三位遍历,比如先109,再106,最后103,每次先取出高位进行递归表示,并取出低位留着下一次递归表示,最后要去除字符串末尾的空格。递归表示时,依次判断0、<10、<20、<100以及100到999,其中0、<10、<20可以直接索引数组表示,而<100需要先表示十位再递归表示个位,而100到999需要先表示百位再递归表示到<100表示。假设1234567891,计算机会将其分为1/234/567/891,先表示1为One Billion,再从234/567/891中取出234,表示234为100到999,故2/34,即Two Hundred,再取出34,表示34为<100,故3/4,即Thirty,最后表示4为Four,整个234递归后返回Two Hundred Thirty Four Million,以此类推。

//个位  n<10 Digits[n]=n
string Digits[10] = {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};
//十几  n<20 Teens[n-10]=n
string Teens[10] = {"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen"};
//几十  n<100 Tens[n/10]=n
string Tens[10] = {"", "Ten", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"};
//千 百万 十亿 3 6 9  
string Thousands[10] = {"", "Thousand", "Million", "Billion"};
string numberToWords(int num) 
{
   if (num == 0)
     return "Zero";
   string ans;
   int unit=1e9;
   //三个三个一位 从高位向低位遍历 Thousands[i]依次九位、六位、三位、0位
   for(int i=3;i>=0;i--)
   {
     int curNum=num/unit;
     //九位以上 六位以上 三位以上
     if(curNum!=0)
     {
        //取出剩余部分
        num-=curNum*unit;
        string str;
        dfs(str,curNum);
        ans+=str+Thousands[i]+" ";
     }
     //除以三位
     unit/=1000;
  }
  //去掉末尾空格
  while(ans.back()==' ')
    ans.pop_back();
  return ans;
}
void dfs(string& str,int curNum)
{
   if(curNum==0)
     return;
   if(curNum<10)
     str+=Digits[curNum]+" ";
   else if(curNum<20)
   {
     int curPos=curNum-10;
     str+=Teens[curPos]+" ";
   }
   else if(curNum<100)
   {
     int curPos=curNum/10;
     curNum-=curPos*10;
     str+=Tens[curPos]+" ";
     dfs(str,curNum);
   }
   else
   {
     int curPos=curNum/100;
     curNum-=curPos*100;
     str+=Digits[curPos]+" "+"Hundred ";
     dfs(str,curNum);
   }
}

总结:10的9次方为1e9。注意,其先是三位三位一划分,然后每次使用递归表示当前所划分的内容,递归中又分为个位、十几、几十、几百。理清这两层!!!

你可能感兴趣的:(程序员面试金典,面试,职场和发展)