SWE · Coding

Meta 整数转英文:三位分组、零段与格式

将整数转英文词组,分离百位组和千/百万/十亿尺度,处理空组与空格。

题目重点:将整数转英文词组,分离百位组和千/百万/十亿尺度,处理空组与空格。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练0≤n<10^12,英文美式无and、无连字符,Title Case、单空格;Zero单独返回。负数、万亿及本地化读法不在示例合同。

解题路线

  1. 每三位组成一组,独立处理0..999:百位输出One..Nine Hundred,余数小于20用独立词表,20以上先十位词再个位。不能把11读成Ten One。
  2. 从Billion、Million、Thousand到个位依次divmod,非零组才输出组词与scale。零组完全跳过,不输出Zero Thousand;全数为0则专门处理。
  3. 用词token列表最终join,避免条件拼接造成前后或双空格。Forty、Eighty等拼写应显式词表,不由数字字符串规则推导。
  4. 分组边界通过1000进位,10^6和10^9不是每组都重复加标签。范围检查保证组内≤999;支持更大整数只需扩展scale表,但要给名称与输入上限。
  5. 独立验证将输出token按Hundred与scale解析回整数,另查已知格式样例和空格,避免测试oracle再写同一三位生成器。

手动走一遍

1,000,001输出One Million One,不含Zero Thousand;1,010输出One Thousand Ten;100输出One Hundred;0输出Zero,负数拒绝。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

SMALL=('','One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten','Eleven','Twelve','Thirteen','Fourteen','Fifteen','Sixteen','Seventeen','Eighteen','Nineteen')
TENS=('','','Twenty','Thirty','Forty','Fifty','Sixty','Seventy','Eighty','Ninety')


def english_words(number):
    """0 <= number < 10^12, US style no 'and'/hyphens, single spaces."""
    if not isinstance(number,int) or not 0<=number<10**12:raise ValueError('range 0..10^12-1')
    if number==0:return 'Zero'
    def group(n):
        out=[]
        if n>=100:out.extend((SMALL[n//100],'Hundred'));n%=100
        if n>=20:out.append(TENS[n//10]);n%=10
        if n:out.append(SMALL[n])
        return out
    result=[]
    for divisor,scale in ((10**9,'Billion'),(10**6,'Million'),(1000,'Thousand'),(1,'')):
        count,number=divmod(number,divisor)
        if count:
            result.extend(group(count))
            if scale:result.append(scale)
    return ' '.join(result)

复杂度

固定训练范围组数最多4,数值运算常数次;若推广D位整数,分组及输出O(D),输出词列表O(D)。任意精度整数的除法成本另计,不把无限整数运算视为固定O(1)。

易错点与追问

容易失分的边界

  • 零组仍输出scale会生成One Million Thousand One。
  • 直接trim只能去边界空格,不能修复中间双空格与错误词序。

继续深挖

  • 支持负数时Minus前缀怎样处理0和最小固定宽度整数?
  • 英式and或其他语言读法应作为格式策略,不混入当前词表。
✓已复制微信号!