2021-07-29 面试题

101 阅读1分钟

今天面试有两个面试题,记录一下

题目一 最长回文子串




// 最短回文串  
// 中心扩散法


// 输入一个字符串:如 babad
// return: 最大的回文子串 => bab
function f(s){
  let len = s.length;
  // a b单个字符也是回文
  if(len < 2) return s;

  
  function getMax(l, r){
    while(l >=0 && r < len && s[l] === s[r]){
      l --;
      r ++;
    }
    return {
      l: l + 1,
      r: r - 1
    }; // 最后满足条件还l--和r++了
  }


  let start = 0, end = 0;
  for(let i = 0; i < len; i ++){
    let obj1 = getMax(i, i); // aba类型
    let obj2 = getMax(i, i+1); // abba类型
    let maxObj = obj1.r - obj1.l > obj2.r - obj2.l ? obj1: obj2;
    if(maxObj.r - maxObj.l > end - start){
      start = maxObj.l;
      end = maxObj.r;
    }
  }

  return s.slice(start, end+1);

}


const s = "cbbd";
const res = f(s);

console.log(res);

几个注意点:回文类型 aba 和 abba类型都计算一遍即可,从中心扩展

2 绝对路径


// 用栈

// 输入: 一个包含.. 和. 的相对路径
// 输出: 一个绝对路径

function f(s){

  const stk = []; 

  // 先分割为数组
  const arr = s.split("/")
  // console.log(arr);

  // console.log(arr);
  //入栈
  for(let i = 0; i < arr.length; i ++){
    if(arr[i] === '..') stk.pop(); // 出栈一个路径
    else if(arr[i] === '.' || arr[i] === '') continue;
    else stk.push(arr[i]);
  }

  // console.log(stk);

  if(stk.length === 0) return '/'
  // 
  let res = '/';
  res += stk.join('/');
  return res;
}


// const s = 'a/b/c/.././' /a/b
// const s = 'a/../../..'  '/
const s = '/A/B/../C/D/../E'
const res = f(s)
console.log(res);

这个题,面试写的是dp,但是额外开了一个dp数组,面试官提醒可以用stack来做,入栈出栈即可完成模拟了