程序员老鬼

不是吧哥们?说好的工资5到6k,入职发3000,简直太坑了!

最近在网上看到一个挺有意思的对话,简直让人想笑又有点心疼。网友分享说:

hr:我们核实了一下,你的工资是3000没错
网友:不是最低5000吗?
hr:入职时就和你说了,工资是5到6000
hr:不是5000到6000。

这场面,简直可以拍成一部职场剧!😂

Image

从程序员的角度来看,这种事情还真不是个别现象。大家都知道,面试时那种“工资面议”、“看能力”等话术,简直是职场的常见套路。大部分人进公司之前,都会听到一个模糊的数字,感觉自己跟面试官达成了共识,心里想着,哎,差不多能拿个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. 1. LESS_THAN_20 和 TENS 数组:这两个数组分别存储了从0到19的数字和20及以上的十位数的英文表示。
  2. 2. THOUSANDS 数组:这是为了处理大于1000的数值。它对应的是“千”、“百万”、“十亿”这些单位。
  3. 3. helper 方法:这个方法是递归的核心部分,它负责将三位数以内的数字转换成英文。例如,345 会通过递归被转换为 "Three Hundred Forty Five"。
  4. 4. numberToWords 方法:这是主方法,它将输入的数字按千分位分解,并通过调用helper方法逐层转化。

五、优化和复杂度分析

  • • 时间复杂度:假设输入的数字是n位数,最多有O(n)的递归调用。
  • • 空间复杂度:主要是栈空间和存储结果的空间,整体是O(n)的空间复杂度。

六、总结

通过这道题,咱们不仅练习了基本的字符串操作和递归技巧,还加深了对数字表示方式的理解。

虽然这道题的思路并不复杂,但它能帮助我们熟悉数字和英文之间的映射,尤其是在涉及到千分位和大数字时,掌握了这个转换的方式,就能应对类似的题目了。

不过,别以为这道题就完事了,我们程序员的日常可不止这些。以后遇到类似的题目,咱可以多动脑筋,从不同的角度去思考。就像有句话说得好:“程序员的世界,只有你想不到的,没有你写不出来的。” 😎

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

-END-

ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学可以联系我,微信:hls404 找我领取。

以上,就是今天的分享了,看完文章记得右下角点赞,也欢迎在评论区写下你的留言。