题解 | #学英语#

学英语

https://www.nowcoder.com/practice/1364723563ab43c99f3d38b5abef83bc

解题思路

  1. 首先需要处理1-19的基本数字到英文的映射
  2. 处理20,30,40...90这样的整十数到英文的映射
  3. 根据数字的位数,将其分成不同的部分:
    • 个位数和十位数(1-99)
    • 百位数(hundred)
    • 千位数(thousand)
    • 百万位(million)
  4. 从高位到低位处理,按照规则拼接英文单词
  5. 注意处理and的添加规则:百位后面有数字时需要加and

代码

def numberToWords(num):
    if num == 0:
        return "zero"
        
    ones = ["", "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 helper(n):
        if n == 0:
            return ""
        elif n < 20:
            return ones[n] + " "
        elif n < 100:
            return tens[n//10] + " " + ones[n%10] + " "
        elif n < 1000:
            if n % 100 == 0:
                return ones[n//100] + " hundred "
            return ones[n//100] + " hundred and " + helper(n%100)
        elif n < 1000000:
            if n % 1000 == 0:
                return helper(n//1000) + "thousand "
            return helper(n//1000) + "thousand " + helper(n%1000)
        else:
            if n % 1000000 == 0:
                return helper(n//1000000) + "million "
            return helper(n//1000000) + "million " + helper(n%1000000)
    ans = helper(num).strip()
    return ans.replace("  ", " ")

# 处理输入
n = int(input())
print(numberToWords(n))
import java.util.*;

public class Main {
    private final String[] ONES = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
            "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
    private final String[] TENS = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};

    public String numberToWords(int num) {
        if (num == 0) return "zero";
        return helper(num).trim();
    }

    private String helper(int num) {
        StringBuilder result = new StringBuilder();
        
        if (num >= 1000000) {
            result.append(helper(num / 1000000)).append("million ");
            num %= 1000000;
        }
        
        if (num >= 1000) {
            result.append(helper(num / 1000)).append("thousand ");
            num %= 1000;
        }
        
        if (num >= 100) {
            result.append(ONES[num / 100]).append(" hundred ");
            if (num % 100 != 0) {
                result.append("and ");
            }
            num %= 100;
        }
        
        if (num >= 20) {
            result.append(TENS[num / 10]).append(" ");
            if (num % 10 != 0) {
                result.append(ONES[num % 10]).append(" ");
            }
        } else if (num > 0) {
            result.append(ONES[num]).append(" ");
        }
        
        return result.toString();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(new Main().numberToWords(n));
    }
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Solution {
private:
    vector<string> ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten",
                          "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
    vector<string> tens = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
    
    string helper(int num) {
        if (num == 0) return "";
        
        string result;
        if (num >= 1000000) {
            result += helper(num / 1000000) + "million ";
            num %= 1000000;
        }
        
        if (num >= 1000) {
            result += helper(num / 1000) + "thousand ";
            num %= 1000;
        }
        
        if (num >= 100) {
            result += ones[num / 100] + " hundred ";
            if (num % 100 != 0) {
                result += "and ";
            }
            num %= 100;
        }
        
        if (num >= 20) {
            result += tens[num / 10] + " ";
            if (num % 10 != 0) {
                result += ones[num % 10] + " ";
            }
        } else if (num > 0) {
            result += ones[num] + " ";
        }
        
        return result;
    }
    
public:
    string numberToWords(int num) {
        if (num == 0) return "zero";
        string result = helper(num);
        // 删除末尾空格
        while (result.back() == ' ') {
            result.pop_back();
        }
        return result;
    }
};

int main() {
    int n;
    cin >> n;
    Solution solution;
    cout << solution.numberToWords(n) << endl;
    return 0;
}

算法及复杂度

  • 算法:字符串处理,递归
  • 时间复杂度: - 与输入数字的位数相关
  • 空间复杂度: - 递归调用栈的深度与数字的位数相关
全部评论

相关推荐

原来已经一年了,因为没有加任何实验室没有学长学姐带,再一次偶然的机会下刷到我们学校的牛肉哥,和他聊天之后发现他也没加实验室能进大厂,我就燃起了希望,去年大概&nbsp;4&nbsp;月份找好路线&nbsp;零基础&nbsp;开始学&nbsp;5&nbsp;月背八股和开始刷算法很难受&nbsp;7-8&nbsp;月焦虑躯体化害怕找不到实习&nbsp;9&nbsp;月找到一家像样的小厂去实习了&nbsp;4&nbsp;个月大三上期末考试结束之后&nbsp;1&nbsp;月份回来边实习边准备工作压力很大&nbsp;当时只有字节、百度、商汤的面试,字节三面挂了,百度&nbsp;oc,商汤&nbsp;二面挂(差评&nbsp;无效面试),之后来深圳百度实习之后还是觉得不甘心一直没把算法和八股扔下一直在准备,百度实习的时候&nbsp;mt&nbsp;交给我一个特别重要的工作数据库迁移(特别感谢&nbsp;mt&nbsp;,这个需求学到了很多东西处理了一堆线上问题),本来看着暑期他们面试都很困难,然后听说百度要涨实习薪资(然而&nbsp;5&nbsp;月并没有涨),就想着留在百度吧也懒得面试了,4&nbsp;月&nbsp;20&nbsp;多的时候字节&nbsp;hr&nbsp;打电话约面问我要不要尝试一下询问了&nbsp;1&nbsp;月份三面为啥会挂有没有学习&nbsp;ai&nbsp;知识(因为字节这边后端岗位偏&nbsp;ai),我来到百度之后全面拥抱&nbsp;AI&nbsp;也认识了我的好兄弟&nbsp;X&nbsp;哥,他在百度&nbsp;XX&nbsp;部门&nbsp;Agent&nbsp;实习,他属于是我&nbsp;Agent&nbsp;的启蒙老师,来百度之后一直在了解&nbsp;AI&nbsp;这一块,我就接受了字节的面试,一面的时候&nbsp;20&nbsp;分钟实习拷打然后突然说&nbsp;30&nbsp;分钟代码考核我心就凉了以为是&nbsp;kpi,算法题是手撕高并发安全下的令牌桶限流器,我写了整整&nbsp;80&nbsp;多行代码最后也写出来了,但是从来没看到过出这种题能&nbsp;oc&nbsp;的我也就不管了,后边面试也是很顺利但是流程有点长可能一直在横向吧总结结果是好的!!!感谢这一年努力的自己和遇到的各位互联网大佬分享的知识!!!ps&nbsp;图二纯感慨&nbsp;(觉得🍬请不要喷我)欢迎大家一起交流学习呀!!!!
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务