裸睡,一觉醒来发现隔壁躺着hr。。。

文摘   2024-11-21 10:27   山西  

这帖子一看就是那种让人越看越觉得离谱的故事,感觉整个画面都带着浓浓的社死气息。裸睡,醒来发现隔壁床多了个人,还是秋招的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(' ');
}

看起来就三步,实际上已经把问题拆解得非常干净了。具体来说:

  1. s.trim():去掉字符串前后多余的空格。
  2. s.split(/\s+/):用正则匹配一个或多个空格,把字符串拆成单词数组。
  3. words.reverse():把单词顺序反转。
  4. 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"

说实话,上面的代码已经够简洁了。但如果面试官再问,能不能手动实现而不依赖现成的方法?那就有点意思了。我们可以不用 splitreverse,直接用双指针来解决。

用双指针的版本,代码如下:

function reverseWords(s{
    let result = '';
    let end = s.length - 1;

    while (end >= 0) {
        // 跳过末尾的空格
        while (end >= 0 && s[end] === ' ') end--;
        if (end < 0break;

        let start = end;
        // 找到单词的起始位置
        while (start >= 0 && s[start] !== ' ') start--;

        // 截取单词并加到结果中
        result += s.slice(start + 1, end + 1) + ' ';
        end = start - 1;
    }

    // 去掉结果末尾多余的空格
    return result.trim();
}

这个实现更底层一些,没有用到数组的 splitreverse 方法,而是通过指针操作直接定位每个单词的范围。虽然代码长了一些,但逻辑还是很清晰的。

一般来说,面试官关心的不是你直接搞出个答案,而是你如何一步步解决问题。比如:

  1. 你能不能把问题拆分成多个小任务(去空格、反转、拼接)。
  2. 你是不是清楚每个 API 的用途,尤其是正则表达式和字符串处理。
  3. 你是否考虑了边界情况,比如多余空格、空字符串等等。

如果能同时用简单方案(API 实现)和复杂方案(双指针实现)解题,那面试官估计会对你刮目相看。

目前,对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。

虎哥私藏精品 热门推荐

虎哥作为一名老码农,整理了全网最前端资料合集

资料包含了《前端面试题PDF合集》、《前端学习视频》、《前端项目及源码》,总量高达108GB。

全部免费领取全面满足各个阶段程序员的学习需求!

web前端专栏
回复 javascript,获取前端面试题。分享前端教程,AI编程,AI工具,Tailwind CSS,Tailwind组件,javascript教程,webstorm教程,html教程,css教程,nodejs教程,vue教程。
 最新文章