JavaScript之练习测试(3)

测试题来源:

https://www.nowcoder.com/practice/edbc7496a36e433c89d298b9256af856?tpId=6&tqId=10951&rp=1&ru=/ta/js-assessment&qru=/ta/js-assessment/question-ranking

下文所有的运行时间和占用内存仅供参考。

题目1描述

找出元素 item 在给定数组 arr 中的位置

输出描述:

如果数组中存在 item,则返回元素在数组中的位置,否则返回 -1
示例1

输入

[ 1, 2, 3, 4 ], 3

输出

2
代码
function indexOf(arr, item) {

   for(var i=0;i<arr.length; i++){
        if(arr[i]==item){
            return i;
        }
    }
    return -1;
}

运行时间:157ms

占用内存:14144k


题目2描述

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

输入描述:

数组中的元素均为 Number 类型
示例1

输入

[ 1, 2, 3, 4 ]

输出

10
代码
function sum(arr) {
    var s=0;
    var i;
  	for(i in arr){
		s+=arr[i];
    }
    return s;
}

运行时间:157ms

占用内存:14400k



题目3描述

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

输入

[1, 2, 3, 4, 2], 2

输出

[1, 3, 4]
代码1
function remove(arr, item) {
    var i;
    var j=0;
    var myarr=new Array();
	for(i in arr ){
        if(arr[i]!=item){
            myarr[j]=arr[i];
            j++;
        }
    }
    return myarr;
}

代码2
function remove(arr, item) {
    var i;
    var myarr=new Array();
	for(i in arr ){
        if(arr[i]!=item){
          myarr.push(arr[i]);
        }
    }
    return myarr;
}

题目4描述

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

输入

[1, 2, 2, 3, 4, 2, 2], 2

输出

[1, 3, 4]
代码
function removeWithoutCopy(arr, item) {
    for( var i in arr){
        while(arr[i]==item){
           arr.splice(i,1);
        }
    }
    return arr;
}

运行时间:157ms

占用内存:14400k

注意:在这使用while,使用if是错误的,因为splice会删除一个位置的空间,使得判断完第i个位置的数据,第i+1位置的数据会出现在第i位上,如果是if,只判断删除前的i的位置一次,原本i+1位置上的数直接略过了,导致程序出错。

题目5描述

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

输入

[1, 2, 3, 4],  10

输出

[1, 2, 3, 4, 10]
代码1:
function append(arr, item) {
    var myarr=new Array();
    for(var i in arr){
        myarr.push(arr[i]);
    }
	myarr.push(item);
    return myarr;
}
运行时间:194ms
占用内存:14272k
代码2:
function append(arr, item) {
    var myarr=arr.slice(0);
    return myarr.concat([item]);
}

运行时间:154ms

占用内存:14400k

题目6描述

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

输入

[1, 2, 3, 4]

输出

[1, 2, 3]
代码:
function truncate(arr) {
	var myarr=[];
    //1
    //myarr=arr.slice(0);
   	// myarr.pop();
    
    //2
    myarr=arr.slice(0,arr.length-1);
    return myarr;
}

运行时间:152ms

占用内存:14400k



题目7描述

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

输入

[1, 2, 3, 4], 10

输出

[10, 1, 2, 3, 4]
错误实例代码:
function prepend(arr, item) {
	var myarr=[];
    	myarr=arr;
  	myarr.unshift(item);
    return myarr;
}
原因:myarr是引用的是arr的空间,改变了myarr,也就改变了arr,因为是同一个空间,所以出错。
针对该方法的解决方案:
该slice()方法并不会修改数组,而是返回一个子数组。-------来自w3School之js篇
function prepend(arr, item) {
	var myarr=[];
    	myarr=arr.slice(0);
  	myarr.unshift(item);
    return myarr;
}

运行时间:158ms

占用内存:14404k


代码2:
使用合理的原因:concat会改变现有的数组,而仅仅会返回被连接数组的一个副本。
function prepend(arr, item) {
	return [item].concat(arr);
}

运行时间:177ms

占用内存:14148k


更多思路:创建数组,对arr执行遍历,并赋值给myarr也是可以的。

题目8描述

删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组
示例1

输入

[1, 2, 3, 4]

输出

[2, 3, 4]
代:1:
function curtail(arr) {
    var myarr=[];
    myarr=arr.slice(1);
    return myarr;
}
代码2:
function curtail(arr) {
    var myarr=[];
    myarr=arr.concat();
    myarr.shift();
    return myarr;
}
代码3:
function curtail(arr) {
    var myarr=[];
    myarr=arr.slice(0);
    myarr.shift();
    return myarr;
}

题目9描述

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

输入

[1, 2, 3, 4], ['a', 'b', 'c', 1]

输出

[1, 2, 3, 4, 'a', 'b', 'c', 1]
代码1:
      
      
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
代码2:
      
      
function concat(arr1, arr2) {
    var myarr=arr1.slice(0);
    for(var i=0;i<arr2.length;i++){
        myarr.push(arr2[i]);     }     return myarr;
}

题目10描述

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

输入

[1, 2, 3, 4], 'z', 2

输出

[1, 2, 'z', 3, 4]
代码1:
      
      
function insert(arr, item, index) {
return arr.slice(0,index).concat(item,arr.slice(index))
}
代码2:        ---------出自牛客网讨论
原理:在index位置上删除0个数据,添加一个item
      
      
function insert(arr, item, index) {
var newArr=arr.concat();
newArr.splice(index,0,item);
    return newArr;
}

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值