不是吧哥们?说好的工资5到6k,入职发3000,简直太坑了!
最近在网上看到一个挺有意思的对话,简直让人想笑又有点心疼。网友分享说:
hr:我们核实了一下,你的工资是3000没错
网友:不是最低5000吗?
hr:入职时就和你说了,工资是5到6000
hr:不是5000到6000。
这场面,简直可以拍成一部职场剧!😂
从程序员的角度来看,这种事情还真不是个别现象。大家都知道,面试时那种“工资面议”、“看能力”等话术,简直是职场的常见套路。大部分人进公司之前,都会听到一个模糊的数字,感觉自己跟面试官达成了共识,心里想着,哎,差不多能拿个5000、6000也挺好的,结果一看发工资单,简直是晴天霹雳——3000块!😱
这时候,HR的解释也特别“精彩”。他们通常会说:“入职时就说了啊,工资范围是5到6000。”你自己仔细想想,谁会在面试时和你明确工资具体数目呢?都是那些“区间”说得云淡风轻,最后实际给你定个底线,还真不是想象中的高。
其实吧,大家进公司之前就应该有个清楚的认知:工资可能是有“浮动空间”,但“浮动”的时候,还是得在你能接受的范围内啊,不然岂不是成了笑话?😂【备注:文末可领最新资料】
算法题:整数转换为英文表示
今天咱们来聊个经典的算法题——整数转换为英文表示。听起来是不是有点枯燥?其实不然。这类题目不仅能够帮我们锻炼基本的算法功底,还能让我们熟悉处理字符串和数值的技巧,别说程序员的日常,就是想学好编程的同学们也可以拿这道题练练手。
好,废话不多说,咱直接进入正题。这道题的目标很简单:给定一个整数,返回它的英文表示。比如输入123,输出应该是"One Hundred Twenty Three"。如果是12345,那就变成了"Twelve Thousand Three Hundred Forty Five"。
一、算法设计思路
首先,咱们从整体思路上来分析。对于这个问题,核心挑战在于如何将一个整数拆解成英文单词。我们可以将整数分成几个部分:亿、万、千、百、十,然后再去逐个翻译。
比如:
• 123可以拆成1 Hundred 20 + 3;• 12345则可以拆成12 Thousand + 345。
我们可以定义一个递归的思路,首先把数字从大的单位拆到小的单位,处理完一个单位就去处理下一个更小的单位。
二、数字到英文的映射
我们需要一些映射表来简化转换过程。对于个位、十位和百位,英文的表达方式是固定的。这里有个小问题,10到19之间的数字是有独特表达的,比如10是“Ten”,11是“Eleven”,13是“Thirteen”,而20以上的数字则是“Twenty”,“Thirty”,依此类推。
具体的映射表如下:
• 单位部分: "One", "Two", "Three", ...• 十位部分: "Twenty", "Thirty", "Forty", ...• 十一到十九: "Eleven", "Twelve", "Thirteen", ...• 大单位: "Thousand", "Million", "Billion"
三、代码实现
接下来,我们用 Java 来实现这个整数转换成英文的功能。代码如下:
publicclassNumberToWords {
privatestaticfinal String[] LESS_THAN_20 = {
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen",
"Seventeen", "Eighteen", "Nineteen"
};
privatestaticfinal String[] TENS = {
"", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"
};
privatestaticfinal String[] THOUSANDS = {
"", "Thousand", "Million", "Billion"
};
public String numberToWords(int num) {
if (num == 0) return"Zero";
Stringresult="";
intthousandIndex=0;
while (num > 0) {
if (num % 1000 != 0) {
result = helper(num % 1000) + THOUSANDS[thousandIndex] + " " + result;
}
num /= 1000;
thousandIndex++;
}
return result.trim();
}
private String helper(int num) {
if (num == 0) return"";
elseif (num < 20) return LESS_THAN_20[num] + " ";
elseif (num < 100) return TENS[num / 10] + " " + helper(num % 10);
elsereturn LESS_THAN_20[num / 100] + " Hundred " + helper(num % 100);
}
publicstaticvoidmain(String[] args) {
NumberToWordsconverter=newNumberToWords();
System.out.println(converter.numberToWords(123)); // "One Hundred Twenty Three"
System.out.println(converter.numberToWords(12345)); // "Twelve Thousand Three Hundred Forty Five"
System.out.println(converter.numberToWords(1234567)); // "One Million Two Hundred Thirty Four Thousand Five Hundred Sixty Seven"
}
}四、解析代码
1. LESS_THAN_20和TENS数组:这两个数组分别存储了从0到19的数字和20及以上的十位数的英文表示。2. THOUSANDS数组:这是为了处理大于1000的数值。它对应的是“千”、“百万”、“十亿”这些单位。3. helper方法:这个方法是递归的核心部分,它负责将三位数以内的数字转换成英文。例如,345会通过递归被转换为"Three Hundred Forty Five"。4. numberToWords方法:这是主方法,它将输入的数字按千分位分解,并通过调用helper方法逐层转化。
五、优化和复杂度分析
• 时间复杂度:假设输入的数字是n位数,最多有 O(n)的递归调用。• 空间复杂度:主要是栈空间和存储结果的空间,整体是 O(n)的空间复杂度。
六、总结
通过这道题,咱们不仅练习了基本的字符串操作和递归技巧,还加深了对数字表示方式的理解。
虽然这道题的思路并不复杂,但它能帮助我们熟悉数字和英文之间的映射,尤其是在涉及到千分位和大数字时,掌握了这个转换的方式,就能应对类似的题目了。
不过,别以为这道题就完事了,我们程序员的日常可不止这些。以后遇到类似的题目,咱可以多动脑筋,从不同的角度去思考。就像有句话说得好:“程序员的世界,只有你想不到的,没有你写不出来的。” 😎
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
-END-
以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。