JavasJavaScript笔试题
这几天参加了好多场宣讲会,记录一下遇到的编程题还有平时练习遇到的(如果有更好的方法欢迎提出,本人也是菜鸟一枚):
1.数组查重,并返回出重复次数最多的项并记录重复次数:
function chachong(arr){ arr = arr.sort(); //排序 var b=[],max={},c=[],t; b[0] = {val:arr[0],count:1}; for(var i = 1; i<arr.length; i++){ //去重 if(arr[i] != b[b.length-1].val){ b.push({val:arr[i],count:1}); }else{ b[b.length-1].count++; //记录次数 } } for(var n = b.length-1; n>0; n--){ //按重复次数排序 for(var m = 0; m<n; m++){ if(b[m].count > b[m+1].count){ t = b[m]; b[m] = b[m+1]; b[m+1] = t; } } } console.log(b) max = b[b.length-1]; c.push(max); for(var j = b.length-2; j>0; j--){ if(b[j].count>=max.count){ c.push(b[j]); } break; } return c; }
结果:
次数最多是‘aa’和3,都为两次;
2.分苹果:
n 只奶牛坐在一排,每个奶牛拥有 ai 个苹果,现在你要在它们之间转移苹果,使得最后所有奶牛拥有的苹果数都相同,每一次,你只能从一只奶牛身上拿走恰好两个苹果到另一个奶牛上,问最少需要移动多少次可以平分苹果,如果方案不存在输出 -1。
1 function fn(arr){ 2 var total = 0,b=[],small=0,len = arr.length; 3 for(var i=0;i<len;i++){ //求出苹果总数 4 total+=arr[i]; 5 } 6 console.log(total); 7 if(total%len!=0){ //判断是否能够平分 8 return -1; 9 } 10 var a = total/len; //平均数 11 console.log(a); 12 b = arr.map(function(item){return a-item;}); //求差值 13 console.log(b); 14 for(var j=0;j<b.length;j++){ //判断每个有多余苹果的牛身上的苹果是否能够分完 15 if(b[j]%2!=0){ 16 return -1; 17 } 18 } 19 b.forEach(function(item){ //移动次数即为差值为正的数的总和除2 20 if(item>0){ 21 small+=item; 22 } 23 }); 24 25 return small/2; 26 }
运行结果:
3.各种正则表达式验证:
a.匹配邮箱:邮箱的具体规则我也不是特别清楚,百度了也没找到很清晰的规则,大致就是(1)@(2).(3)这样三个分组,第一个分组中可以包含字母数字下划线和‘.’还有‘-’,第二个分组是主机名,只能包含字母数字和‘-’,第三个分组是后缀,这里的后缀有的是com有的是com.cn等等组合比较多,下面是我自己写的,如果有错误请指出:
1 var pattern = /^([\w\.\-]+)@([0-9a-zA-Z\-]+)\.([a-zA-Z]+(\.[a-zA-Z]+)*)$/;
测试结果:
b.电话号码验证:做这题的时候很懵,因为根本不知道手机号的格式是什么,只知道有11位,而且固定电话就更不知道了,后来是看了这篇博客,这个可以去原博看看,他用的Java其实正则都差不多,我就复制了下:
/*手机号 *移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147、182 * 联通号码段:130、131、132、136、185、186、145 * 电信号码段:133、153、180、189、177 */ var pattern = /^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[01256789])|(177))\d{8}$/
测试结果:
//固定电话 var pattern = /^(0\d{2}-\d{8}(-\d{1,4})?)|(0\d{3}-\d{7,8}(-\d{1,4})?)$/;
测试结果:
4.58同城今年的校招题目:为String对象添加一个route方法,实现一下效果:
var url = 'https://www.baidu.com/one/two'; url.route('/a/:b') //{b:'two'} url.route('/:a/b') //{a:'one'} url.route('/:a/:b') //{a:'one',b:'two'}
下面是我的实现方法:
1 var url = 'https://www.baidu.com/one/two'; 2 String.prototype.route = router; 3 function router(str){ 4 var val = this.toString(),a=[],b=[],result={}; 5 var pattern = /(?:[a-z]+\:\/\/)(?:[\w\.]+)\/([\w]+)\/([\w]+)/; //提取出尾部参数 6 a=pattern.exec(val).slice(1); 7 console.log(a); 8 var pattern1 = /^\/(\:?[a-z]+)\/(\:?[a-z]+)/; //也是提取参数 9 b=pattern1.exec(str).slice(1); 10 console.log(b); 11 for(var i = 0;i<b.length;i++){ 12 if(b[i].indexOf(':')!=-1){ 13 console.log(b[i]) 14 var v = b[i].slice(1); 15 result[v]=a[i]; 16 } 17 } 18 return result;
测试结果: