面试-编程题目

作者: Aaron_Alphabet | 来源:发表于2017-09-16 11:00 被阅读0次

    1. TOPN 排序

    有一字符串数组string(),对应有一个权重数组int[ ],现按照如下规则取出字符串数组的top5:
    1)对每个数组求综合得分,综合得分=权重得分+顺序得分,权重打得分对应的权重值,顺序得分为字符串在字符串数组中的顺序号(从1开始)
    2)按综合得分升序排列,综合得分相同,按照原先顺序排列,然后输出

    function top5_parms(str,weight,n) {
        var _sum=[];
        var _top5=[];
        var index;
        for(var i=0;i<str.length;i++){
            _sum[i]=i+weight[i]+1;
        }
        for(var k=0;k<n;k++){
            var _max=Math.max.apply(Math,_sum);
            var _min=Math.min.apply(Math,_sum);
            for(var j=0;j<_sum.length;j++){
                if(_sum[j]==_min){
                    index=j;
                    console.log(index);
                    _top5[k]=str[index];
                    _sum.splice(index,1,_max+1);
                    break;
                }
            }
        }
        console.log(_top5.join(""));  // CDBFA
    }
    var _str=["A","B","C","D","E","F","G","H"];
    var _weight=[7,5,3,2,6,1,4,9];
    top5_parms(_str,_weight,5);
    
    

    2. phoneNumber

    A mapping of digit to letters (just like on the telephone buttons) is given below.
    Input:Digit string "23"
    Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

    phonenumber.png
    function phnum(n1,n2){
      var numbs = {'2':'abc', '3':'def', '4':'ghi', '5':'jkl', '6':'mno', '7':'pqrs', '8':'tuv', '9':'wxyz'};
      var res=[];
      if((n1==1)||(n2==1)){
          return null;
      }
      for(var i=0;i<numbs[n1].length;i++){
          for(var j=0;j<numbs[n2].length;j++){
              res.push(numbs[n1][i]+numbs[n2][j]);
          }
      }
      return res.toString()
    }
    phnum(1,3);
    
    

    3. arguments 对象 和 正则

    (function(window) {
                function fn(str) {
                    this.str = str;
                }
                fn.prototype.format = function() {
                    var arg = arguments;
                    return this.str.replace(/\?\?\{(\d+)\}/ig, function(a, b) {
                        return arg[b] || '';
                    })
                };
                window.fn = fn;
            })(window);
    
    // use
    var t = new fn('<p><a href="??{0}">??{1}</a><span>??{2}</span></p>');
    console.log(t.format('http://Alibaba.com','Alibaba','welcome'));
    
    

    4. MySQL查询语句中加limit

    对于MySQL查询语句,我们可以加上limitN来限制查询条数,但是如果查询语句中已经加油limitN,则不能再加limitN,请写程序判断sql查询语句是否加上limit N。答案为yes和no,通过逗号分隔,例如yes,no,no

    function add_limit(_str) {
        var res=[];
        for(var i=0;i<_str.length;i++){
            if(_str[i].indexOf("limit")==-1){
                res.push("yes");
            }else{
                res.push("no");
            }
        }
        console.log(res.toString());
    }
    var _strlist=[
        "select * from table",
        "select * from table limit 1000",
        "select * from (select * from table limit 10000) sub_qry"];
    add_limit(_strlist);
    
    

    5. 列出JavaScript的继承实现方式,并使用一种你喜欢的方式实现如下继承

    1)parent包含 共有方法:pubFun;私有方法:priFun
    2)Child继承parent
    使用es6实现

    1)继承第一种方式:对象冒充
    function Parent(username){
      this.username = username;
      this.hello = function(){
       alert(this.username);
      }
    }
    function Child(username,password){
      //通过以下3行实现将Parent的属性和方法追加到Child中,从而实现继承
      //第一步:this.method是作为一个临时的属性,并且指向Parent所指向的对象,
      //第二步:执行this.method方法,即执行Parent所指向的对象函数
      //第三步:销毁this.method属性,即此时Child就已经拥有了Parent的所有属性和方法 
      this.method = Parent;
      this.method(username);//最关键的一行
      delete this.method;
      this.password = password;
      this.world = function(){
       alert(this.password);
      }
    }
    var parent = new Parent("zhangsan");
    var child = new Child("lisi","123456");
    parent.hello();
    child.hello();
    child.world();
    
    2、继承第二种方式:call()方法方式
    
    call方法是Function类中的方法
    call方法的第一个参数的值赋值给类(即方法)中出现的this
    call方法的第二个参数开始依次赋值给类(即方法)所接受的参数
    
    function test(str){
      alert(this.name + " " + str);
    }
    var object = new Object();
    object.name = "zhangsan";
    test.call(object,"langsin");//此时,第一个参数值object传递给了test类(即方法)中出现的this,而第二个参数"langsin"则赋值给了test类(即方法)的str
    function Parent(username){
      this.username = username;
      this.hello = function(){
       alert(this.username);
      }
    }
    function Child(username,password){
      Parent.call(this,username);
      this.password = password;
      this.world = function(){
       alert(this.password);
      }
    }
    var parent = new Parent("zhangsan");
    var child = new Child("lisi","123456");
    parent.hello();
    child.hello();
    child.world();
    
    3、继承的第三种方式:apply()方法方式
    apply方法接受2个参数,
    A、第一个参数与call方法的第一个参数一样,即赋值给类(即方法)中出现的this
    B、第二个参数为数组类型,这个数组中的每个元素依次赋值给类(即方法)所接受的参数
    
    function Parent(username){ 
      this.username = username; 
      this.hello = function(){ 
       alert(this.username); 
      } 
    } 
    function Child(username,password){ 
      Parent.apply(this,new Array(username)); 
      this.password = password; 
      this.world = function(){ 
       alert(this.password); 
      } 
    } 
    var parent = new Parent("zhangsan"); 
    var child = new Child("lisi","123456"); 
    parent.hello(); 
    child.hello(); 
    child.world();
    
    4、继承的第四种方式:原型链方式,
    即子类通过prototype将所有在父类中通过prototype追加的属性和方法都追加到Child,从而实现了继承
    
    function Person(){ 
    } 
    Person.prototype.hello = "hello"; 
    Person.prototype.sayHello = function(){ 
      alert(this.hello); 
    } 
    function Child(){ 
    } 
    Child.prototype = new Person();//这行的作用是:将Parent中将所有通过prototype追加的属性和方法都追加到Child,从而实现了继承 
    Child.prototype.world = "world"; 
    Child.prototype.sayWorld = function(){ 
      alert(this.world); 
    } 
    var c = new Child(); 
    c.sayHello(); 
    c.sayWorld();
    
    5、继承的第五种方式:混合方式
    混合了call方式、原型链方式
    
    function Parent(hello){ 
      this.hello = hello; 
    } 
    Parent.prototype.sayHello = function(){ 
      alert(this.hello); 
    } 
    function Child(hello,world){ 
      Parent.call(this,hello);//将父类的属性继承过来 
      this.world = world;//新增一些属性 
    } 
    Child.prototype = new Parent();//将父类的方法继承过来 
    Child.prototype.sayWorld = function(){//新增一些方法 
      alert(this.world); 
    } 
    var c = new Child("zhangsan","lisi"); 
    c.sayHello(); 
    c.sayWorld();
    
    

    6.编写SUM函数

    实现不定量的参数求和,非number类型参数需要过滤

    function sumArg(arguments) {
        var res=0;
        for(var i=0;i<arguments.length;i++){
            if(isNaN(arguments[i])){
                continue;
            }
            res+=arguments[i];
        }
        console.log(res);
    }
    var arguments=[1,2,"welcome",4];
    sumArg(arguments);
    
    

    7. 寻找周期

    给定一个日期数组Date[],数组按照某一周期递增,寻找该周期。
    输出结构请输出数字加单位(year、month、day、hour、minute、second)的形式,如5month、10second。

    var _parms_date=["20170101 00:02:01","20170101 05:04:02","20170101 10:06:03","20170101 15:08:04"];
    
    function countRangeDate(parms) {
        var res=[];
        var _newparms=[];
        for(var i=0;i<parms.length;i++){
            var _stri=parms[i].substr(0,4)+"-"+parms[i].substr(4,2)+"-"+parms[i].substr(6,2)+" "+parms[i].substr(9);
            _newparms.push(new Date(_stri));
        }
    
        for(var j=0;j<_newparms.length-1;j++){
            var _year=(_newparms[j+1].getFullYear()-_newparms[j].getFullYear());
            var _month=(_newparms[j+1].getMonth()-_newparms[j].getMonth());
            var _date=(_newparms[j+1].getDate()-_newparms[j].getDate());
            var _time=(_newparms[j+1].getTime()-_newparms[j].getTime());
    
            var _hour=parseInt(_time/1000/60/60);
            var _minute=parseInt(_time/1000/60%60);
            var _second=_time/1000%60;
    
            _year+=_year!=0?"year":"";
            _month+=_month!=0?"month":"";
            _date+=_date!=0?"day":"";
            _hour+=_hour!=0?"hour":"";
            _minute+=_minute!=0?"minute":"";
            _second+=_second!=0?"second":"";
    
            res.push(_year+_month+_date+_hour+_minute+_second);
        }
        console.log(res);
        return(res[0]);
    }
    countRangeDate(_parms_date);
    
    

    8.字符串排序

    给定一个字符串数组string [] ,按照规则进行排序,规则A->B意为A必须在B左边。输出所有可能的排序结果,输出结果按照字符序排列,用逗号隔开。

    没有做出来
    
    function test(parms,rules){
    
            var str=[];
            /*排序,排列出所有rules的可能情况*/
            var sum=1;
            for(var x=1;x<=rules.length;x++){
                sum*=x;
            }
            console.log(sum);
            var index_arr=[];
            for(var xu=0;xu<sum;xu++){
                var index=[];
                for(var indextemp=0;indextemp<rules.length;indextemp++){
                    var indexttt=parseInt(Math.random()*rules.length);
                    if(index.indexOf(rules[indexttt])==-1){
                        index.push(rules[indexttt]);
                    }else{
                        indextemp--;
                    }
                }
                index_arr[xu]=index;
                for(var ind=0;ind<index_arr.length-1;ind++){
                    if(index_arr[index_arr.length-1].join('')==index_arr[ind].join('')){
                        xu--;
                    }
                }
            }
            var temp=[].concat(parms);
            /*数组*/
            for(var t=0;t<sum;t++){
    //            var temp=parms;
    //            console.log(temp);
                for(var i=0;i<index_arr[t].length;i++){
                    var a1=index_arr[t][i].split('->')[0];
                    var a2=index_arr[t][i].split('->')[1];
                    var index1=temp.indexOf(a1);
                    var index2=temp.indexOf(a2);
                    /*删除再加到最前面,最后面*/
                    temp.splice(index1,1);
                    temp.unshift(a1);
                    temp.splice(index2,1);
                    temp.push(a2);
                }
                str[t]=[];
                str[t].push(temp);
                console.log(str[t].join(''));
            }
    
        }
    
        var parms=['A','B','C','D'];
        var rules=['A->C','B->C','D->C'];
    //    var parms=['A','B','C','D','E','F'];
    //    var rules=['A->C','C->B','C->D','A->B','D->F','C->E','B->E'];
        test(parms,rules);
    

    9.解析类型

    给定一个字符串,解析出相应的类型(只有Boolean,number,date,string四种)
    Boolean 类型:true、false,不区分大小写
    number 包括整数,浮点型,科学计数
    date 满足yyyyMMdd 或者yyyyMMdd hh:mm:ss

    function typeStr() {
        var _str=[-100.1,"ABCD","TRUE","20170101 03:05:06"];
        var _regB=/(true|false)/ig;
        var _regD=/^[1-9]\d{7}(||\s{0,2}\d{2}\:\d{2}\:\d{2})/;
        var _res=[];
    
        for(var i=0;i<_str.length;i++){
            if(_regB.test(_str[i])){
                console.log("Boolean");
                _res.push("Boolean");
            }else if(typeof(_str[i])=="number"){
                console.log("Number");
                _res.push("Number");
            }else if(_regD.test(_str[i])){
                console.log("Date");
                _res.push("Date");
            }else{
                console.log("String");
                _res.push("String");
            }
        }
        console.log(_regD.test(_str[1]));
        console.log(_res.toString());
        return _res.toString();
    }
    typeStr();
    

    相关文章

      网友评论

        本文标题:面试-编程题目

        本文链接:https://www.haomeiwen.com/subject/xeyysxtx.html