测试题来源:
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]
代码1function 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描述
代码1:在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组示例1输入
[1, 2, 3, 4], 10输出
[1, 2, 3, 4, 10]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]原因:myarr是引用的是arr的空间,改变了myarr,也就改变了arr,因为是同一个空间,所以出错。function prepend(arr, item) { var myarr=[]; myarr=arr; myarr.unshift(item); return myarr; }
针对该方法的解决方案:该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描述
代:1:删除数组 arr 第一个元素。不要直接修改数组 arr,结果返回新的数组示例1输入
[1, 2, 3, 4]输出
[2, 3, 4]代码2:function curtail(arr) { var myarr=[]; myarr=arr.slice(1); return myarr; }
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;}