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;

测试结果:

 

posted @ 2017-10-19 23:16  法克大叔叔  阅读(420)  评论(0编辑  收藏  举报