前些天看到阿里的招聘就顺便投了份简历,也没有抱有太大的希望能邀请面试,大概过了十多天突然手机响了,面试官要直接跟我聊聊,刚好那天没空,推到了第二天。然后在第二天面试官先让我做了一份机试题,我只做出了两题,一共是三题,这边记录下题目(就在当天晚上我前思后想,还是在睡觉前想出了第二题的解决方案):
1.编写函数`convert(money)` ,传入金额,将金额转换为千分位表示法。例如:12345.6789 => 12,345.6789
2.树结构转化
[
{ id: 2, text: '研发计划', parent: 1 },
{ id: 3, text: '产品方案', parent: 1 },
{ id: 5, text: '技术方案', parent: 2 },
{ id: 4, text: '第二主题' },
{ id: 1, text: '中心主题' },
]
=>
[
{
id: 1,
text: '中心主题',
children: [{
id: 2,
text: '研发计划',
children: [{ id: 5, text: '技术方案' }]
},{
id: 3,
text: '产品方案'
}],
},
{
id: 4,
text: '第二主题',
},
]
3:实现一个方法,用于比较两个版本号(version1、version2)
/**
* 如果version1 > version2,返回1;如果version1 < version2,返回-1,其他情况返回0
* 版本号规则`x.y.z`,xyz均为大于等于0的整数,至少有x位
* 示例:
* compareVersion('0.1', '1.1.1'); // 返回-1
* compareVersion('13.37', '1.2 '); // 返回1
* compareVersion('1.1', '1.1.0'); // 返回0
*/
上面是机试题目,下面我把我的代码贴出来,记录下(逻辑或者代码有问题欢迎在评论里指出,如有更好的解决方案欢迎在评论里献上):
function convert(money){
var arr = (money + "").split(".");
return arr[0].replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,") + "." + arr[1];
}
这里面使用了replace对字符串进行匹配并且替换,一开始我想的是字符串的查找和插入(indexOf, substring等方法,代码写了一半突然想到了split + splice这个方案,但是还是比较复杂,最后直接上表达式,所以以后处理字符串一定要最先想到解决问题的方案优先从表达式开始)
这边说明下?=(前瞻), ?! (负前瞻),?<=(后顾),?
前瞻表示匹配当前的子表达式,并查找前面的表达式。例如:exp1(?=exp2),只有exp2匹配成功,才进行exp1的查找。
负前瞻表示不匹配当前的子表达式,并查找前面的表达式。例如:exp1(?!exp2),只有exp2匹配失败,才进行exp1的查找。
后顾表示匹配当前的子表达式,并查找后面的表达式。例如:(?<=exp2)exp1,只有exp2匹配成功,才进行exp1的查找。
负后顾表示不匹配当前的子表达式,并查找后面的表达式。例如:(?
第二题:
function list2Tree(list) {
var i = 0;
var arr = [];
for (; i < list.length - 1; i++) {
var j = i + 1;
for (; j < list.length; j++) {
var prev = list[i];
var next = list[j];
if (prev.id === next.parent) {
if (!prev.children) {
prev.children = [];
}
delete next.parent;
prev.children.push(next);
list.splice(j, 1);
j--;
}
if (prev.parent === next.id) {
if (!next.children) {
next.children = [];
}
delete prev.parent;
next.children.push(prev);
list.splice(i, 1);
i--;
break;
}
}
}
return list;
}
这个代码的性能O(n^2), 性能方面的改进,欢迎码友们在评论里给出,感谢!
第三题:
function compareVersion(version1, version2) {
var arr1 = version1.split(".");
var arr2 = version2.split(".");
var x = ["0", "0", "0"].map(function (item, index) {
return arr1[index] || item;
})
var y = ["0", "0", "0"].map(function (item, index) {
return arr2[index] || item;
})
if (x[0] > y[0]) {
return 1;
} else if (x[0] < y[0]) {
return -1;
} else {
if (x[1] > y[1]) {
return 1;
} else if (x[1] < y[1]) {
return -1;
} else {
if (x[2] > y[2]) {
return 1;
} else if (x[2] < y[2]) {
return -1;
} else {
return 0;
}
}
}
}