百词斩2018春招笔试题解
虽然很菜,但是题解还是要写的。一来总结反思。二来优化代码,三来混件T-shirt.
第一题:
输入一串只有数字和字母的字符串,输出该字符串中最大的数字
输入:hellowolrd520helloworld1314
输入:hellowolrd520helloworld1314
输出:1314
看了楼下的,觉得我之前做的方法太菜啦,我的正则表达式还是用的不熟练,
用的熟练的可以减少很多不必要的代码
参考代码1:
let str= 'hellowolrd520helloworld1314'; let reg=/[a-z]+/; let arr=str.split(reg); let max=Math.max(...arr); console.log(max);
参考代码2:
let str= 'hellowolrd520helloworld1314'; let reg=/\d+/g; let arr=str.match(reg); let max=Math.max(...arr); console.log(max);
一个星期有7天,按照下面格式输出。
输入:1 3 4 5 7
//全是升序输入,最大长度为7
输出:1,3-5,7
输出:1,3-5,7
//三个以上(包括三个)的连续的用-输出
参考代码
let arr=[1,3,4,5,7]; function getRes(arr) { let res=[]; for(let i=0;i<arr.length;i++){ if(arr[i]+1==arr[i+1]){ res.push(arr[i]); res.push(arr[i+1]) } } res=[...new Set(res)];//去重 if(res.length>=3){ let i=arr.indexOf(res[0]); let j=arr.indexOf(res[res.length-1]); let tmp=""; tmp=res[0]+"-"+res[res.length-1]; arr.splice(i,j-i+1,tmp);//将原数组中的数字用转换过后的格式替换掉 } return arr; } console.log(getRes(arr).join(","));
第三题:
输入为n个数,输出为n个数的全排列所产生的不同的数,并且要求升序。
输入:第一行为n,接下来为n行要排列组合的数。
3
1
5
9
输出
159
195
519
591
915
951
195
519
591
915
951
思考:
我们要得到全排列,只要像冒泡一样交换各个位就行,不过要注意取模达到重复效果。循环次数为全排列种类数。举例如下
159,交换1和2,得519
519,交换2和3,得591
591,交换1和2,得951
951,交换2和3,得915
915,交换1和2,得195
195,交换2和3,得159
参考代码:
let x=[1,5,9],res=[]; function getNum(v) { return v?getNum(v-1)*v:1; } m=getNum(x.length);//全排列种类数 let k=0; while(m--){ let tmp=""; x.forEach(i=>{tmp+=i}); res.push(tmp); [x[k],x[k+1]]=[x[k+1],x[k]]; k=(++k%(x.length-1)); } res.sort((a,b)=>a-b); res.forEach(i=>console.log(i));