3月31日一次失败的算法面试经历

152 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1. 前言

之前总是隐约感觉自己解题思维有问题,可是一直通过刷 leetcode 的方式(5,6分钟没有解答出来就看答案,记住思路)没有暴露出来。今天经历一次失败的算法面试,又让自己陷入了思考。

2. 题目

给定一个字符串,重复项删除会删除掉相邻两项甚至多项相同的项,这样反复删除,直到没有相邻且相同的项。

有问题的解法

刚开始的想法就是直接在原数组中进行删除操作,用一个对象纪录之前的项,索引,是否操作过,这样写最难的就是序号维护,不知道什么时候需要删除什么时候不能删除。

// 测试用例
let a = "abbc"; // 两个或两个以上就可以消除
let b = "abba";
let c = "abbbc";
let d = "addaa";

// 代码部分
let arr = c.split("");
let backWord = {
  word: "",
  index: -1,
  hasHandled: false,
};
let i = 0;

while (arr.length) {
  if (arr[i] === backWord.word) {
    arr.splice(i, 1);
    arr[backWord.index] === backWord.word && arr.splice(backWord.index, 1);
    backWord.hasHandled = true;
  } else {
    Object.assign(backWord, {
      word: arr[i],
      index: i,
    });
    i++;
    if (i >= arr.length && backWord.hasHandled) {  // 序号超过数组长度且有删除过重新遍历
      i = 0;
      backWord.hasHandled = false;
    }
    if (i >= arr.length && !backWord.hasHandled) break; // 序号超过数组长度且没有删除过就跳出循环
  }
}

console.log(arr.join(""));

2.2 leetcode 官方解法

leetcode 地址

这里运用了一个新的去维护需要输出的字符,遍历字符串,如果栈里面有相同的项,就把该项从栈里面剔除,如果栈里面没有相同的项就可以将该项入栈。

var removeDuplicates = function (s) {
    let stack = []
    for (const char of s) {
        if (stack.length && stack[stack.length - 1] === char) {
            stack.pop()
        } else {
            stack.push(char)
        }
    }
    return stack.join('')
}

3. 总结

首先解算法题时间太长就要反思是不是解法有问题,本题错误的解法直接在原数组进行删除操作花费了四十多分钟,而看懂官方解法只需要花费几分钟。其次,解决算法问题的时候至少要给出自己的思路并且思考问题的难点在哪里,看别人代码的时候需要思考解法的亮点在哪里,为什么可以这样想。