面试-编程题目

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();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,302评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,232评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,337评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,977评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,920评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,194评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,638评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,319评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,455评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,379评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,426评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,106评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,696评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,786评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,996评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,467评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,043评论 2 341

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,537评论 18 399
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • php usleep() 函数延迟代码执行若干微秒。 unpack() 函数从二进制字符串对数据进行解包。 uni...
    思梦PHP阅读 1,979评论 1 24
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,566评论 18 139
  • 为了用webpack打包CSS文件,必须在在你的JavaScript代码中引入CSS文件, 并运用 css-loa...
    炎武森禄阅读 950评论 0 1