记录一下刚做的前端(雾)面试题

本文解析了前端面试中常见的五道题目,包括字符串反转的递归实现、逆波兰表达式计算、归并排序、JSON去重及扁平数据转组织树等,提供了详细的代码示例与思路说明。

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

记录一下刚做的前端(雾)面试题

刚做了一家公司的面试题,感觉以后很少会用到,我肯定要搞忘,现在记录一下。

题目:
1.编写一个递归版本的 reverse(s) 函数(或方法),以将字符串s倒置。

2.编写程序 expr,以计算从命令行输入的逆波兰表达式的值,其中每个运算符或操作数用一个单独的参数表示。例如,命令 expr 2 3 4 + *

3.用归并排序将3,1,4,1,5,9,2,6 排序。

4.对下面的 json 字符串 serial 相同的进行去重。
在这里插入图片描述

5.把下面给出的扁平化json数据用递归的方式改写成组织树的形式

[
    {
      "id": "1",
      "name": "中国",
      "code": "110",
      "parent": ""
    },
    {
      "id": "2",
      "name": "北京市",
      "code": "110000",
      "parent": "110"
    },
    {
      "id": "3",
      "name": "河北省",
      "code": "130000",
      "parent": "110"
    },
    {
      "id": "4",
      "name": "四川省",
      "code": "510000",
      "parent": "110"
    },
    {
      "id": "5",
      "name": "石家庄市",
      "code": "130001",
      "parent": "130000"
    },
    {
      "id": "6",
      "name": "唐山市",
      "code": "130002",
      "parent": "130000"
    },
    {
      "id": "7",
      "name": "邢台市",
      "code": "130003",
      "parent": "130000"
    },
    {
      "id": "8",
      "name": "成都市",
      "code": "510001",
      "parent": "510000"
    },
    {
      "id": "9",
      "name": "简阳市",
      "code": "510002",
      "parent": "510000"
    },
    {
      "id": "10",
      "name": "武侯区",
      "code": "51000101",
      "parent": "510001"
    },
    {
      "id": "11",
      "name": "金牛区",
      "code": "51000102",
      "parent": "510001"
    }
  ];

看到题目的我,眼泪留下来。

但是学到老,活到老嘛,我还是尽力做了一遍。

第一题:

	reverse = (str = '') => {
	  return str.split('').reverse().join('');
	}

这道题我答错了,我实在是没找到如何用js写递归reverse,有大神可以指点一二吗?

第二题:

	expr = (arr = []) => {
	  if (!arr) return 0;  //字符串为空,返回0
	  
	  var tempArr = arr.split(' ')
	  var elems = [];
	  let item = '';
	  while (item = tempArr.shift) {
	    if (!isNaN(+item)) {
	      elems.push(+item)
	    } else {
	      var res = count(item, elems.pop, elems.pop)
	      elems.push(res)
	    }
	  }
	}
	
	count = (opera, num1, num2) => {
	
	  switch (opera) {
	    case '+':
	      return num2 + num1
	    case '-':
	      return num2 - num1
	    case '*':
	      return num2 * num1
	    case '/':
	      return num2 / num1
	  }
	}

逆波兰表达式我是看的这篇文章
里面讲的很详细,逆波兰表达式主要是按照入栈顺序来做计算的。

比如 1 2 3 + 3 * -
按照入栈的顺序,先1 再2 再3,然后是+号,在+号之前入栈的两个数是2和3,先算2+3 结果为5,把5入栈。

现在栈中有

	5
	1

接下来是3,继续入栈,之后遇见*号

	3
	5
	1

这里运算3*5 =15,把15入栈

	15
	1

接着遇到-号,运算1-15 =-14。

第三题:

	mergeSort = () => {
	  var arr = [3, 1, 4, 1, 5, 9, 2, 6];
	
	  if (arr.length === 1)
	    return arr;
	
	  var mid = (a.length / 2), left = a.slice(0, mid), right = a.slice(mid);
	
	  return merge(mergeSort(left), mergeSort(right));
	}
	
	merge = (left, right) => {
	
	  while (left.length && right.length) {
	    if (left[0] < right[0])
	      tmp.push(left.shift());
	    else
	      tmp.push(right.shift());
	  }
	
	  return tmp.concat(left, right);
	}

归并排序,我参考的这一篇,里面详细解释了归并排序是怎么操作的。

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

用js的思维来讲,就是把一个数组从最中间切开,为两个数组,然后用两个数组的数来比较排序,存入一个新的数组。

第四题:

	unique = () => {
	  let arr = [{
	    "name": "张三",
	    "serial": "0001"
	  }, {
	    "name": "李四",
	    "serial": "0002"
	  }, {
	    "name": "王五",
	    "serial": "0003"
	  }, {
	    "name": "王五2",
	    "serial": "0003"
	  }, {
	    "name": "赵四",
	    "serial": "0004"
	  }, {
	    "name": "小明",
	    "serial": "005"
	  }, {
	    "name": "小张",
	    "serial": "006"
	  }, {
	    "name": "小李",
	    "serial": "006"
	  }, {
	    "name": "小李2",
	    "serial": "006"
	  }, {
	    "name": "赵四2",
	    "serial": "0004"
	  }];
	  let newArr = [];
	  for (let item of arr) {
	    const { serial = '' } = item;
	    const aaa = newArr.find(item => item.serial === serial);
	    if (!aaa) {
	      newArr.push(item);
	    }
	  }
	  return newArr;
	}

第四题很简单,就是遍历数组,然后比较item.serial是否重复。

第五题:

	var tree = [
	  {
	    "id": "1",
	    "name": "中国",
	    "code": "110",
	    "parent": ""
	  },
	  {
	    "id": "2",
	    "name": "北京市",
	    "code": "110000",
	    "parent": "110"
	  },
	  {
	    "id": "3",
	    "name": "河北省",
	    "code": "130000",
	    "parent": "110"
	  },
	  {
	    "id": "4",
	    "name": "四川省",
	    "code": "510000",
	    "parent": "110"
	  },
	  {
	    "id": "5",
	    "name": "石家庄市",
	    "code": "130001",
	    "parent": "130000"
	  },
	  {
	    "id": "6",
	    "name": "唐山市",
	    "code": "130002",
	    "parent": "130000"
	  },
	  {
	    "id": "7",
	    "name": "邢台市",
	    "code": "130003",
	    "parent": "130000"
	  },
	  {
	    "id": "8",
	    "name": "成都市",
	    "code": "510001",
	    "parent": "510000"
	  },
	  {
	    "id": "9",
	    "name": "简阳市",
	    "code": "510002",
	    "parent": "510000"
	  },
	  {
	    "id": "10",
	    "name": "武侯区",
	    "code": "51000101",
	    "parent": "510001"
	  },
	  {
	    "id": "11",
	    "name": "金牛区",
	    "code": "51000102",
	    "parent": "510001"
	  }
	];
	
	transDate = (tree, idstr = 'id', pidstr = 'parent') => {
	  let result = [], temp = {};
	  for (i = 0; i < tree.length; i++) {
	    temp[tree[i][idstr]] = tree[i];
	  }
	  for (j = 0; j < tree.length; j++) {
	    tempVp = temp[tree[j][pidstr]];
	    if (tempVp) {
	      if (!tempVp["nodes"]) tempVp["nodes"] = [];
	      tempVp["nodes"].push(tree[j]);
	    } else {
	      result.push(tree[j]);
	    }
	  }
	  return result;
	}  

第五题也没难度,大家看代码就能懂了。

完。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值