美团前端一面手写面试题

这篇博客汇总了美团前端一面的面试题,涵盖了实现斐波那契数列、电话号码验证、DOM转JSON、最长不重复子串等多个知识点,还包括事件总线在Vue中的实现、Promise、数组操作和函数优化等常见面试题目,全面考察前端开发者的基础能力和实践经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现斐波那契数列

// 递归
function fn (n){
   
    if(n==0) return 0
    if(n==1) return 1
    return fn(n-2)+fn(n-1)
}
// 优化
function fibonacci2(n) {
   
    const arr = [1, 1, 2];
    const arrLen = arr.length;

    if (n <= arrLen) {
   
        return arr[n];
    }

    for (let i = arrLen; i < n; i++) {
   
        arr.push(arr[i - 1] + arr[ i - 2]);
    }

    return arr[arr.length - 1];
}
// 非递归
function fn(n) {
   
    let pre1 = 1;
    let pre2 = 1;
    let current = 2;

    if (n <= 2) {
   
        return current;
    }

    for (let i = 2; i < n; i++) {
   
        pre1 = pre2;
        pre2 = current;
        current = pre1 + pre2;
    }

    return current;
}

判断是否是电话号码

function isPhone(tel) {
   
    var regx = /^1[34578]\d{9}$/;
    return regx.test(tel);
}

查找数组公共前缀(美团)

题目描述

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

答案

const longestCommonPrefix = function (strs) {
   
  const str = strs[0];
  let index = 0;
  while (index < str.length) {
   
    const strCur = str.slice(0, index + 1);
    for (let i = 0; i < strs.length; i++) {
   
      if (!strs[i] || !strs[i].startsWith(strCur)) {
   
        return str.slice(0, index);
      }
    }
    index++;
  }
  return str;
};

请实现 DOM2JSON 一个函数,可以把一个 DOM 节点输出 JSON 的格式

<div>
  <span>
    <a></a>
  </span>
  <span>
    <a></a>
    <a></a>
  </span>
</div>

把上面dom结构转成下面的JSON格式

{
   
  tag: 'DIV',
  children: [
    {
   
      tag: 'SPAN',
      children: [
        {
    tag: 'A', children: [] }
      ]
    },
    {
   
      tag: 'SPAN',
      children: [
        {
    tag: 'A', children: [] },
        {
    tag: 'A', children: [] }
      ]
    }
  ]
}

实现代码如下:

function dom2Json(domtree) {
   
  let obj = {
   };
  obj.name = domtree.tagName;
  obj.children = [];
  domtree.childNodes.forEach((child) => obj.children.push(dom2Json(child)));
  return obj;
}

字符串最长的不重复子串

题目描述

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。


示例 1:

输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

示例 4:

输入: s = ""
输出: 0

答案

const lengthOfLongestSubstring = function (s) {
   
  if (s.length === 0) {
   
    return 0;
  }

  let left = 0;
  let right = 1;
  let max = 0;
  while (right <= s.length) {
   
    let lr = s.slice(left, right);
    const index = lr.indexOf(s[right]);

    if (index > -1) {
   
      left = index + left + 1;
    } else {
   
      lr = s.slice(left, right + 1);
      max = Math.max(max, lr.length);
    }
    right++;
  }
  return max;
};

实现千位分隔符

// 保留三位小数
parseToMoney(1234.56); // return '1,234.56'
parseToMoney(123456789); // return '123,456,789'
parseToMoney
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值