这帖子一看就是那种让人越看越觉得离谱的故事,感觉整个画面都带着浓浓的社死气息。裸睡,醒来发现隔壁床多了个人,还是秋招的HR大大,这啥运气啊?我当程序员这么多年,见过的bug都没这么离奇。
咱就说,酒店给安排双人床也就算了,半夜还悄悄塞进来一个人,这操作真是给我看迷糊了。
更离谱的是,内裤袜子啥的都整整齐齐被人搬到桌子上去了,完全是一种被围观的错觉。虽然HR人家可能心态淡定,毕竟见多识广,但作为面试者,这心理阴影面积得有足球场那么大吧?
不过话又说回来,这位楼主还真是心大,直接聊起来才知道是HR,幸好人家没半夜开始考察你,不然真是“从头尴尬到脚”。但我想问一句:HR能把你放过吗?面试者是裸睡这件事,不会影响最终评价吧?
今日算法题
好了,瓜吃完了,我们再来聊点技术,最近我刷 LeetCode 的时候,遇到了一道看起来“人畜无害”的题目,叫“反转字符串中的单词”。
乍一看,我还以为是让人写个 reverse()
方法,结果一看题目描述,发现事情没有那么简单。这题的本质其实是让我们处理字符串,涉及到去除多余空格、调整顺序等操作,总结起来就是:不仅要实现功能,还要把代码写得优雅。
题目要求是这样的:给你一个字符串,字符串里包含多个单词(单词之间可能有多个空格),需要把这些单词的顺序反过来,同时还得把多余的空格去掉。简单来说,就是把乱糟糟的字符串整理得干干净净,还要倒过来。
比如:
输入: " hello world "
输出: "world hello"
看着是不是很简单?别急,我们一步步拆解一下。
第一步,字符串里可能有很多坑:前面后面可能有空格,单词之间的空格可能不止一个。要解决这个问题,得先清理掉这些“冗余”内容。
第二步,要把单词顺序反转。这看似简单,但如果不清楚 JavaScript 的字符串操作,可能会绕点弯路。
那我们就开干!用 JavaScript 解决这题的关键在于两件事:字符串拆分和数组操作。这里有个思路,咱们可以先把字符串按空格拆成数组,然后对数组操作,最后再拼回去。
废话少说,直接上代码:
function reverseWords(s) {
// 去除前后空格并按单词拆分
const words = s.trim().split(/\s+/);
// 反转单词数组
const reversed = words.reverse();
// 拼接成字符串
return reversed.join(' ');
}
看起来就三步,实际上已经把问题拆解得非常干净了。具体来说:
s.trim()
:去掉字符串前后多余的空格。s.split(/\s+/)
:用正则匹配一个或多个空格,把字符串拆成单词数组。words.reverse()
:把单词顺序反转。reversed.join(' ')
:用一个空格把反转后的单词拼成新字符串。
再来看几个边界情况,确保代码没问题:
输入是空字符串,比如 ""
。我们得返回""
。输入全是空格,比如 " "
。我们也得返回""
。单个单词,比如 "hello"
。输出就是原单词"hello"
。
测试一下:
console.log(reverseWords(" hello world ")); // 输出: "world hello"
console.log(reverseWords("a good example")); // 输出: "example good a"
console.log(reverseWords(" ")); // 输出: ""
console.log(reverseWords("singleword")); // 输出: "singleword"
说实话,上面的代码已经够简洁了。但如果面试官再问,能不能手动实现而不依赖现成的方法?那就有点意思了。我们可以不用 split
和 reverse
,直接用双指针来解决。
用双指针的版本,代码如下:
function reverseWords(s) {
let result = '';
let end = s.length - 1;
while (end >= 0) {
// 跳过末尾的空格
while (end >= 0 && s[end] === ' ') end--;
if (end < 0) break;
let start = end;
// 找到单词的起始位置
while (start >= 0 && s[start] !== ' ') start--;
// 截取单词并加到结果中
result += s.slice(start + 1, end + 1) + ' ';
end = start - 1;
}
// 去掉结果末尾多余的空格
return result.trim();
}
这个实现更底层一些,没有用到数组的 split
和 reverse
方法,而是通过指针操作直接定位每个单词的范围。虽然代码长了一些,但逻辑还是很清晰的。
一般来说,面试官关心的不是你直接搞出个答案,而是你如何一步步解决问题。比如:
你能不能把问题拆分成多个小任务(去空格、反转、拼接)。 你是不是清楚每个 API 的用途,尤其是正则表达式和字符串处理。 你是否考虑了边界情况,比如多余空格、空字符串等等。
如果能同时用简单方案(API 实现)和复杂方案(双指针实现)解题,那面试官估计会对你刮目相看。
目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥私藏精品 热门推荐 虎哥作为一名老码农,整理了全网最全《前端资料合集》。