牛客網上面有一個關于js的自測,然后我看了一下原作者的github,記錄一下解題過程吧。
所以,對數組操作,不改變原來數組的方法,concat,slice,
改變原來數組的方法,splice,pop,shift,push,unshift
- 找出元素 item 在給定數組 arr 中的位置
我的答案
function indexOf(arr, item) {
for(var i=0;i<arr.length;i++){
if(arr[i]=== item){
return i;
}
}
return -1
}
原作者給出的答案。
indexOf: function(arr, item) {
/*
if (Array.prototype.indexOf) { return arr.indexOf(item); }
*/
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
return i;
}
}
return -1;
},
這里面有一行被注釋,如果這個方法存在的話,那么直接返回這個方法,否則使用重新定義的方法。還有一個是提前計算數組的長度,這樣可以提高效率。
- 數組求和
我的答案
function sum(arr) {
var sum = 0;
for(var i =0,len=arr.length;i<len;i++){
sum = sum + arr[i];
}
return sum;
}
原作者給出的答案
sum: function(arr) {
var sum = 0;
for (var i = 0, len = arr.length; i < len; i++) {
sum += arr[i];
}
return sum;
},
- 移除元素,返回新數組
我的答案
function remove(arr, item) {
var new_arr = [];
for(var i=0,len = arr.length;i<len;i++){
if(arr[i]!==item){
new_arr.push(arr[i]);
}
}
return new_arr;
}
原作者
remove: function(arr, item) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] !== item) {
ret.push(arr[i]);
}
}
return ret;
},
- 移除數組元素不要拷貝
移除數組 arr 中的所有值與 item 相等的元素,直接在給定的 arr 數組上進行操作,并將結果返回
我的解法
function removeWithoutCopy(arr, item) {
for(var i=arr.length-1;i>=0;i--){
if(arr[i]===item){
arr.splice(i,1);
}
}
return arr;
}
原作者
removeWithoutCopy: function(arr, item) {
var i;
var len;
for (i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
arr.splice(i, 1);
i--;
len--;
}
}
return arr;
},
好吧,我覺得我的方法更好。
- 添加元素
在數組 arr 末尾添加元素 item。不要直接修改數組 arr,結果返回新的數組
function append(arr, item) {
var new_arr = [];
for(var i=0;i<arr.length;i++){
new_arr.push(arr[i]);
}
new_arr.push(item);
return new_arr;
}
看到有一些關于數組的操作,其中concat是不改變原數組的
function append(arr, item) {
// return arr.push(item);
return arr.concat([item]);
}
另外或者利用slice來復制數組
function append(arr, item) {
var a = arr.slice(0);
a.push(item);
return a;
}
原作者給的答案,應該是歧義吧
append: function(arr, item) {
arr.push(item);
return arr;
}
- 刪除數組第一個元素
function curtail(arr) {
return [].concat(arr).slice(1);
}
當時沒想到,slice也是復制數組的,所以應該是
function curtail(arr) {
return arr.slice(1);
}
與上題一樣,作者給出來的是改變數組的
truncate: function(arr) {
arr.pop();
return arr;
},
- 數組合并
合并數組 arr1 和數組 arr2。不要直接修改數組 arr,結果返回新的數組
我的,我以為要自己原生態實現。
function concat(arr1, arr2) {
return arr1.concat(arr2);
}
作者的
concat: function(arr1, arr2) {
return arr1.concat(arr2);
}
- 添加元素
在數組 arr 的 index 處添加元素 item。不要直接修改數組 arr,結果返回新的數組
先用slice拷貝數組,再用splice來添加元素.
function insert(arr, item, index) {
var b = arr.slice(0);
b.splice(index,0,item);
return b;
}
原作者不拷貝
insert: function(arr, item, index) {
arr.splice(index, 0, item);
return arr;
}
- 計數
function count(arr, item) {
var cc = 0;
for(var i=0;i<arr.length;i++ ){
if(arr[i]===item){
cc+=1;
}
}
return cc;
}
作者
count: function(arr, item) {
var count = 0;
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === item) {
count++;
}
}
return count;
}
- 查找重復元素
找出數組 arr 中重復出現過的元素
function duplicates(arr) {
var cc={};
var new_arr = [];
for(var i=0;i<arr.length;i++){
arr[i] in cc?cc[arr[i]]=cc[arr[i]]+1:cc[arr[i]] = 1;
}
for(key in cc){
if(cc[key]>1){
new_arr.push(key);
}
}
return new_arr;
}
duplicates: function(arr) {
var seen = {};
var dupes = [];
for (var i = 0, len = arr.length; i < len; i++) {
seen[arr[i]] = seen[arr[i]] ? seen[arr[i]] + 1 : 1;
}
for (var item in seen) {
if (seen.hasOwnProperty(item) && seen[item] > 1) {
dupes.push(item);
}
}
return dupes;
},
作者直接用seen[arr[i]]來表示存在與否,好吧我表示 保留意見,在這題里面是沒有問題的。但是hasOwnProperty來判斷熟悉也是應該的。
- 求二次方
為數組 arr 中的每個元素求二次方。不要直接修改數組 arr,結果返回新的數組
function square(arr) {
return arr.map(function(item){
return item*item;
})
}
square: function(arr) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
ret.push(arr[i] * arr[i]);
}
return ret;
},
- 查找元素位置
function findAllOccurrences(arr, target) {
var res=[];
for(var i=0,len = arr.length;i<len;i++){
if(arr[i]===target){
res.push(i);
}
}
return res;
}
findAllOccurrences: function(arr, target) {
var ret = [];
for (var i = 0, len = arr.length; i < len; i++) {
if (arr[i] === target) {
ret.push(i);
}
}
return ret;
}