刚做了一家公司的面试题,感觉以后很少会用到,我肯定要搞忘,现在记录一下。
题目:
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;
}
第五题也没难度,大家看代码就能懂了。
完。