例如: 1-->one
100--one hundred.
表示。。。这道题基本是得以前见过才能写出来的。 [我在做这道题的时候脑子里一团混乱, 1. 一直想着one, two, three, four, tens, twentys, hundres, ...billions 基本所有的数字的英语单词然而忽略了一些线索。 2. 脑袋里一直有一种想要数 num几位数的implementation ]
核心思想是把数字分成几个bucket: Billion, Million, Thousand。 然后第一步先确认integer在哪一个范围内。这个bucket的设计无比的巧妙,自习看会发现每个bucket之间有一个1000的倍数。我们拿到int的时候,从最大的bucket开始判断, 也就是Billion。如果小于Billion,拿Million试看看。如果大于Million,我们基本知道num最多也就是几百million因为到1000million就进位到billion了。 然后取一下具体是多少million, 先写下来: X million. 这个X, less than 1000, 可以用另一个function 来专门负责处理这么千位数范围内的转换。
然后取一下这个num 最大位后面的数。 比如三百二十万,先去掉最大的百万位,还剩20万。num这时候等于20万, 然后我们重复刚刚的步骤iteratively 来写下这个数。
仔细分析了一下,这个算法竟然跟人们生活中转换数字和单词完全一样。 我们先看看最大位是个啥,然后写下来,然后第二大位的写下来。【大家都是从左往右写字嘛】
这么分析下来,当一个人第一次见到这个题目。逻辑上应该注意到如果分解整个Int成几个bucket的大位数。 我觉得能够做到这一步应该是很不容易了,第一次做就能推算出来bucket size为1000 并且是在面试中做到就有点太厉害了。。(也不是不可能,突破口在于英语里的大位数基本就是billion, million, thousand. 不过一般很容易脑子里浮现的全是one, ten, hundred, thoudsand, million, billion而注意不到这个细节)
*补充一下:
convert hundres to string:
return LESS_THAN_20[num / 100] + " Hundred " + trans(num % 100);