微软算法面经实录|把任意整数“朗读”成英文单词的头脑风暴全记录 – ms vo – 微软面经

我想把上周参加微软线上算法面试的全过程贴出来,真实还原我当时的思路、对话和演算示例,帮大家更好地准备这一道常见题。

面试官直接在聊天框里发来原题:

“Please write a function that converts any integer into its English words representation.”

我心里一跳:核心需求就是把 1234567 这样的数字读成 “one million two hundred and thirty-four thousand five hundred and sixty-seven”。但细节有很多可能的追问。于是我第一时间在聊天室回复:
“我想确认一下,输入范围是 32 位正整数吗?如果是负数要输出 ‘minus’ 吗?另外我们需要在 ‘hundred’ 后面加上 英式的 ‘and’ 吗?”
面试官很爽快地答:“先按 0…2³¹-1 正整数来,记得提到负数和更大范围的扩展思路;‘and’ 英式可选,你可以说明。”这下我心里松了口气,也更有方向。

接下来我在白板(虚拟画布)上画了一个大数字 1,234,567 → [1] [234] [567],口播思路:

  1. 分组:从最低位开始,每三位一组;
  2. 小函数convertChunk(n) 处理 0…999:
    • 如果 n < 20,直接查 ONES/TEENS 表;
    • 如果 20 ≤ n < 100,先输出 TENS[n//10](如 “forty”),再处理 n%10
    • 如果 n ≥ 100,先输出 ONES[n//100] + " hundred",如果余数不为 0,再加 “ and ” + 递归处理余数;
  3. 拼接:每组后面拼 ""/"thousand"/"million"/"billion",并把每组结果插到最前面;
  4. 特殊情况:如果整个输入是 0,直接返回 “zero”;循环结束后再 trim() 空格。

我边写伪代码边解释,大概像这样:

        
function numberToWords(num):
    if num == 0:
        return "zero"
    result = ""
    chunkIndex = 0
    while num > 0:
        chunk = num % 1000
        if chunk != 0:
            words = convertChunk(chunk)
            result = words + THOUSANDS[chunkIndex] + " " + result
        num = num // 1000
        chunkIndex += 1
    return result.trim()

function convertChunk(n):
    if n < 20:
        return ONES[n]
    if n < 100:
        return TENS[n//10] + ("" if n%10==0 else " " + ONES[n%10])
    // n >= 100
    rem = n % 100
    return ONES[n//100] + " hundred" + ("" if rem==0 else " and " + convertChunk(rem))
        
    

白板上,我还演示了具体算例:

  • 处理 567:<br>“five hundred and sixty seven”
  • 处理 234:<br>“two hundred and thirty four”
  • 处理 1:<br>“one” + 单位 “million”
    最终合成:
"one million two hundred and thirty four thousand five hundred and sixty seven"

面试官接着问:“如果输入是 -123 呢?”

我答:“最外层加一句 if num<0 then prefix='minus ',再对 abs(num) 走同样逻辑就行。”

她又问:“假如要支持任意长度数字,比如超出 64 位怎么办?”

我说:“可以用语言自带的 BigInteger,或者把数字当字符串处理,每三位切一次,核心逻辑不变。” 对方对此表示认可,气氛非常像两位工程师在讨论设计。

后来,她还围绕“性能”“国际化”“递归 vs 迭代”“内存占用”等展开简短对话。我把时间复杂度 O(d)(d 是数字长度)、空间复杂度 O(d) 的分析也说了一遍。

整个流程下来,我没有背诵模板,而是:先问清需求 → 用图示拆解思路 → 给出伪代码 & 实例演算 → 补充边界和扩展 → 简述复杂度。面试官多次点头,最后用一句“great job”结束。

真心建议大家在准备这类题时,多预想:对方可能关心什么边界?性能?国际化?是不是要英国式/美式差异?当场模拟问答,不要只练代码,沟通逻辑也很关键。祝各位都能一面定乾坤,下次面试顺利过关!

本文的作者 石老师,在这里给大家打个硬广,csoahelp.com每日分享北美大厂面经,小红书也有更新,我们还提供种类多样的收费服务协助您进入北美科技大厂,有意向的微信扫码联系我,或者也可以通过其他方式联系我

If you need more interview support or interview proxy practice, feel free to contact us. We offer comprehensive interview support services to help you successfully land a job at your dream company.

Leave a Reply

Your email address will not be published. Required fields are marked *