这道题要求将英文数字写法转换为阿拉伯数字。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题目理解
1. 输入是英文数字描述,包含可能的 negative 表示负数。
2. 数字范围 -999,999,999 到 999,999,999。
3. 用到的单词是标准的 0–19、20–90(整十)、hundred、thousand、million。
4. 没有 and,例如 103 写作 one hundred three。
5. 规则符合英语习惯,比如 1500 是 one thousand five hundred 而不是 fifteen hundred。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
思路
* 将输入按空格分割成单词列表。
* 处理 negative 标记。
* 依次处理数字,规则如下:
* 遇到 one 到 nineteen → 当前值为 1–19
* 遇到 twenty 到 ninety → 当前值为 20–90
* 遇到 hundred → 当前部分 ×100
* 遇到 thousand → 当前累计值 ×1000 并加到总结果中,重置当前部分
* 遇到 million → 当前累计值 ×1,000,000 并加到总结果中,重置当前部分
* 处理末尾的当前部分加入总结果
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
示例
negative seven hundred twenty nine
1. negative → 标记为负
2. seven → cur = 7
3. hundred → cur = 7 × 100 = 700
4. twenty → cur = 700 + 20 = 720
5. nine → cur = 720 + 9 = 729
6. 结束,total = cur = 729
7. 输出 -729
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
实现代码
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
复杂度
* 时间:O(n),n 为单词数量
* 空间:O(1)(除了单词表固定)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
说明
这个解法直接模拟了英语数字的解析过程,按照 hundred、thousand、million 做乘法和加法,注意要按顺序处理,先加个位十位,遇到 hundred 乘,遇到 thousand/million 累加到总和中再重置。