牛客JS能力测评前20题

1. 在数组 arr 中,查找值与 item 相等的元素出现的所有位置

输入:findAllOccurrences('abcdefabc'.split(''), 'a').sort()
输出:[0, 6]

push() 方法可向数组的末尾添加一个或多个元素,并返回新的长度。
indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
function findAllOccurrences(arr, target) {
    var arr1=[];
    var j=0;
    for(var i=0;i<arr.length;i++){
        if(arr[i]==target){
            arr1.push(arr.indexOf(arr[i],j));
            j++;
        }
    }
    return arr1;

}

  

2. 在Javascript语言中,声明变量使用的都是关键字var,如果不使用var而直接声明变量,则该变量为全局变量。

3. 请修复给定的 js 代码中,函数定义存在的问题 

输入例子:
functions(true)
function functions(flag) {
    if (flag) {
       return 'a';
    }
    return 'b';
}
 
测试通过!

  

4. 修改 js 代码中 parseInt 的调用方式,使之通过全部测试用例 

大写字母A 到Z 的值是从65 到90

小写a到z 是从91 到 122

字符转ascii码:用charCodeAt();
ascii码砖字符:用fromCharCode();

知识点 
parseInt(string, radix)

定义和用法

parseInt() 函数可解析一个字符串,并返回一个整数。

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

当忽略参数 radix , JavaScript 默认数字的基数如下:

如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数(十六进制转为十进制)。
如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。
如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

看例子,是要把字符串里的数字给取出来的,当字符串为十六进制ox12时,结果并不是18,而是0;

所以radix应该是有设置的,当设置了radix时,遇到非数字字符会直接忽略后面的字符。

function parse2Int(num) {
    return parseInt(num,10);
}

5. 判断 val1 和 val2 是否完全等同 (考点为全等"===")

function identity(val1, val2) {
    
    if(val1===val2){
        return true;
    }
    return false;

}

  

6. 实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出

ps:不是很理解

function count(start, end) {
    //立即输出第一个值
    console.log(start++);
    var timer=setInterval(function(){
        if(start<=end){
            console.log(start++);
        }else{
            clearInterval(timer);
        }
    },100);
    //返回一个对象
    return{
        cancel:function(){
            clearInterval(timer);
        }
    };
}

console.log作用:

主要是方便你调式javascript用的。你可以看到你在页面中输出的内容。

相比alert他的优点是:

  1. 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是console能看到对象的内容。

  2. console不会打断你页面的操作,如果用alert弹出来内容,那么页面就死了,但是console输出内容后你页面还可以正常操作。

  3. console里面的内容非常丰富,你可以在控制台输入:console,然后就可看到:

1
Console {memory: MemoryInfo, debug: function, error: function, info: function, log: function…}

它有网页的各种提示。

JavaScript中的setInterval用
setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象。可以使用本动作更新来自数据库的变量或更新时间显示。

7. 实现 fizzBuzz 函数,参数 num 与返回值的关系如下:

1、如果 num 能同时被 3 和 5 整除,返回字符串 fizzbuzz
2、如果 num 能被 3 整除,返回字符串 fizz
3、如果 num 能被 5 整除,返回字符串 buzz
4、如果参数为空或者不是 Number 类型,返回 false
5、其余情况,返回参数 num 
输入例子:
fizzBuzz(15)
输出例子:
fizzbuzz
function fizzBuzz(num) {
    if(num%3==0){
        if(num%5==0){
            return "fizzbuzz";
        }
        return "fizz";
    }else if(num%5==0){
        return "buzz";
    }else{
        if(typeof(num)!="number"){
            return false;
        }else{
            return num;
        }
    }
}

  

8.  将数组 arr 中的元素作为调用函数 fn 的参数 

输入例子:
argsAsArray(function (greeting, name, punctuation) {return greeting + ', ' + name + (punctuation || '!');}, ['Hello', 'Ellie', '!'])
输出例子:
Hello, Ellie!
function argsAsArray(fn, arr) {
    return fn.apply(this,arr);
}

call方法: 
语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
定义:调用一个对象的一个方法,以另一个对象替换当前对象。 
说明: 
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 

apply方法: 
语法:apply([thisObj[,argArray]]) 
定义:应用某一对象的一个方法,用另一个对象替换当前对象。 
说明: 
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。 
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

9. 删除数组 arr 最后一个元素。不要直接修改数组 arr,结果返回新的数组 

pop() 方法用于删除并返回数组的最后一个元素。

function truncate(arr) { 
    var arr2=new Array();
    for(var i=0;i<arr.length-1;i++){
        arr2.push(arr[i]);
    }
    return arr2;
}

  

10.  在数组 arr 开头添加元素 item。不要直接修改数组 arr,结果返回新的数组 

输入例子:
prepend([1, 2, 3, 4], 10)
输出例子:
[10, 1, 2, 3, 4]
function prepend(arr, item) {
    var arr2=new Array();
    arr2.push(item);
    for(var i=0;i<arr.length;i++){
        arr2.push(arr[i]);
    }
    return arr2;
}

  

11.  合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组 

输入例子:
concat([1, 2, 3, 4], ['a', 'b', 'c', 1])
输出例子:
[1, 2, 3, 4, 'a', 'b', 'c', 1]
function concat(arr1, arr2) {
    var arr=new Array();
    for(var i=0;i<arr1.length;i++){
        arr.push(arr1[i]);
    }
    for(var i=0;i<arr2.length;i++){
        arr.push(arr2[i]);
    }
    return arr;
}

  

12.  在数组 arr 的 index 处添加元素 item。不要直接修改数组 arr,结果返回新的数组 

输入例子:
insert([1, 2, 3, 4], 'z', 2)
输出例子:
[1, 2, 'z', 3, 4]
function insert(arr, item, index) {
    var arr1=new Array();
    
    for(var i=0;i<arr.length;i++){
        arr1.push(arr[i]);
        if(index-1==i){
            arr1.push(item);
        }
    }
    return arr1;
}

  

13. 统计数组 arr 中值等于 item 的元素出现的次数 

输入例子:
count([1, 2, 4, 4, 3, 4, 3], 4)
输出例子:
3
function count(arr, item) {
    var x=0;
    for(var i=0;i<arr.length;i++){
        if(arr[i]==item){
            x++;
        }
    }
    return x;
}

  

14.  找出数组 arr 中重复出现过的元素 

输入例子:
duplicates([1, 2, 4, 4, 3, 3, 1, 5, 3]).sort()
输出例子:
[1, 3, 4]

ps:这题答案我居然完全看不懂。。。。。

function duplicates(arr) {
    var arr2=[];
    var obj={};
    for(var i=0,len=arr.length;i<len;i++){
        if(!obj[arr[i]]){
            obj[arr[i]]=1;
        }else{
            obj[arr[i]]++;
            if(obj[arr[i]]==2){
                arr2.push(arr[i]);
            }
        }
    }
    return arr2;
}

这个方法好懂一些,好6

function duplicates(arr) {
    var result=[];
    arr.forEach(function(elem){
       if(arr.indexOf(elem)!=arr.lastIndexOf(elem)&&result.indexOf(elem)==-1){
           result.push(elem);
       } 
    });
    return result;
}

  

sort() 方法用于对数组的元素进行排序。

发现一个厉害的答题方法:http://blog.csdn.net/u014787301/article/details/52206260

15.  为数组 arr 中的每个元素求二次方。不要直接修改数组 arr,结果返回新的数组 

输入例子:
square([1, 2, 3, 4])
输出例子:
[1, 4, 9, 16]
function duplicates(arr) {
    var arr2=[];
    var obj={};
    for(var i=0,len=arr.length;i<len;i++){
        if(!obj[arr[i]]){
            obj[arr[i]]=1;
        }else{
            obj[arr[i]]++;
            if(obj[arr[i]]==2){
                arr2.push(arr[i]);
            }
        }
    }
    return arr2;
}

  

16. 计算给定数组 arr 中所有元素的总和 

输入描述:
数组中的元素均为 Number 类型
输入例子:
sum([ 1, 2, 3, 4 ])
输出例子:
10
ps这个参考的方法啦,用时179s
function sum(arr) {
    var su=0;
    arr.forEach(function(value,index,arr){
        su+=value;
    });
    return su;
}

呜呼,我的要233s,弱爆了。。。。。

function sum(arr) {
    var su=0;
    for(var i=0;i<arr.length;i++){
        su=arr[i]+su;
    }
    return su;
}

  

17.  移除数组 arr 中的所有值与 item 相等的元素。不要直接修改数组 arr,结果返回新的数组 

输入例子: 
remove([1, 2, 3, 4, 2], 2)

输出例子: 
[1, 3, 4]

ps:这个方法,反正我是想不出来的

function remove(arr, item) {
    return arr.filter(function(d){
        return d !== item;
    })
}

18. 移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回 

输入例子:
removeWithoutCopy([1, 2, 2, 3, 4, 2, 2], 2)
输出例子:
[1, 3, 4]
function removeWithoutCopy(arr, item) {
    for(var i=0;i<arr.length;i++){
        if(arr[i]==item){
            arr.splice(i,1);
            i--;
        }
    }
    return arr;

}

splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目。

注释:该方法会改变原始数组。

19. 在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组 

输入例子:
append([1, 2, 3, 4],  10)
输出例子:
[1, 2, 3, 4, 10]
function append(arr, item) {
    return [].concat(arr,item);
}

  

20. 将函数 fn 的执行上下文改为 obj 对象 

输入例子:
speak(function () {return this.greeting + ', ' + this.name + '!!!';}, {greeting: 'Hello', name: 'Rebecca'})
输出例子:
Hello, Rebecca!!!
function speak(fn, obj) {
    return fn.call(obj);

}

  

原文地址:https://www.cnblogs.com/liao13160678112/p/7050866.html