老板玩文字游戏:工资5到6千变3千
发布时间:2026/8/22 11:39:54 作者:尧图编辑部 阅读量:1,286

有网友进行吐槽, 称自己应聘入职那一刻, 老板谈及工资表示是“五到六千”, 然而等到发放工资之时, 一看数额, 人直接呆住了, 到账的仅仅只有三千。随后去找老板进行核对, 老板却表现得非常淡定, 声称没错呀, 所给的就是三千。奇葩的情况出现了, 别人认为“五到六千”就是数值从5000至6000, 然而老板所欲表达的意思竟然是“五千去除以六千”, 又或者是“在五和六之间依据某种随意性来给予”? 不管怎样其那般的解释是, 称自己当初表明的是“5到6千”, 而非呈现整体性的“5000到6000”这玩的文字游戏, HR看了都得先停顿三秒。打工人最怕的并非工资低, 要是工资低你直接讲清楚, 大家还就能决定来或者不来。最让人觉得恶心的是, 入职前说得好像挺像回事似的, 入职后却开始抠字眼, 把合同一拿出来, 嘴一歪还说: 你理解错了。这哪里是在招聘人员, 分明是在垂钓牛马。老板所打的算盘珠子, 都快要崩到员工的脸上, 可老板还自认为自己挺严谨的。今日算法题替换数字这题别一上来就这题看着太小了小到很多人第一眼就想写s.replaceAll(\\d, number)能不能跑大概率能。可是呢, 要是在算法题当中这样去写, 我通常来讲是不太乐意的。并非是说 API 不能够去使用, 而是这道题目考核的根本就不是正则表达式, 而是在字符串扩容以后怎样能够少搬运一些数据。提供一个字符串, 该字符串之中存在字母, 还存在数字, 将所有数字字符替换成。比如a1b2c3处理完变成anumberbnumbercnumber留意这处并非将接连数字视作一个完整整体去替换, 而是每一个单独数字都进行一次替换。也就是说a12b结果是anumbernumberb这个地方别看漏了。我第一次看这种题脑子里会先过一遍最笨的写法String ans ; for (...) { if (是数字) ans number; else ans 当前字符; }这代码能够编写出来, 然而我并非十分信赖它。在Java方面, 其存在不可变对象, 于循环当中始终进行 操作, 随着后续数据量变得庞大, 就会持续创造新的字符串。当题目所给数据较小时并未察觉到异样, 一旦数据稍微增大一些, 那时间方面就会变得很难看了。用 顺着扫一遍当然可以写起来也简单StringBuilder builder new StringBuilder;只是, 这道题目, 更像是在进行“双指针从后往前填”的练习。毕竟, 替换之后那字符串可是会变长的。要是从前往后去处理的话, 后面的字符就会被反复地挪动了。反过来, 从后往前去做就会舒服好多了, 把位置算得明明白白透透彻彻的, 然后一次就填好。思路不绕。先扫一遍原字符串数一下里面有多少个数字。一个别的数, 原本占据一个字符, 替换成空字符串之后, 占据六个字符, 所以, 每碰到一个数字, 最终的长度要多出五个字符。然后开一个新字符数组长度就是原长度 数字个数 * 5两个指针i 指向原字符串末尾 j 指向新数组末尾从后往前扫。如果 s.(i) 是普通字母就直接放到 arr 。如果是数字就倒着塞 。这里存在一个小细节, 它不可以从前往后进行塞入操作, 原因在于我们当下是从后往前对数组进行填充的状态。要么以倒着的方式去书写字符, 要么借助一个字符数组, 按照从后往前的顺序进行拷贝。我一般会写成下面这样没那么花但不容易错import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; publicclassMain{ privatestaticfinalchar WORD {n, u, m, b, e, r}; publicstaticvoidmain(String[] args)throws IOException { BufferedReader reader new BufferedReader(new InputStreamReader(System.in)); String text reader.readLine; int digitCount 0; for (int k 0; k text.length; k) { char ch text.charAt(k); if (ch 0 ch 9) { digitCount; } } char result newchar[text.length() digitCount * 5]; int oldIndex text.length - 1; int newIndex result.length - 1; while (oldIndex 0) { char ch text.charAt(oldIndex); if (ch 0 ch 9) { for (int k WORD.length - 1; k 0; k--) { result[newIndex--] WORD[k]; } } else { result[newIndex--] ch; } oldIndex--; } System.out.println(new String(result)); } }拿这个例子跑一下a1b2c先统计到有 2 个数字原长度是 5新长度就是5 2 * 5 15从后往前填c 直接放 2 替换成 number b 直接放 1 替换成 number a 直接放最后就是anumberbnumberc这题真正容易写错的地方就两个。一个是长度别算是乘以6 , 这是由于原先的数字自身占据了一个位置 , 而扩容增多出来的仅仅是5个位置。一个是将 的顺序进行替换, 你采用从后往前填充数组形式, 再以从前往后书写 n u m b e r方式, 最终的结果就会呈现为反的状态样, 这种bug虽显得低级, 但在操作手速快的时候确实是会被写出来的。时间复杂度是 O(n)前面统计一遍后面填充一遍。空间复杂度同样是O(n), 这是由于在Java当中, 字符串的长度发生了改变, 所以最终必定总要存在一块全新的空间来放置结果。在这儿并不需要去纠结“原地替换”, 毕竟Java的字符串原本就并不适宜进行原地修改。这样的题目不要写得繁杂, 也不要去炫耀应用程序编程接口。将长度计算精确, 从后面朝着前面填写, 基本上就稳妥了。