前端刷題 —— 牛客網前端題庫60道詳解(三) 目錄

目錄

  • 引言

    1. 刪除數組最後一個元素(入門)
    2. 添加元素(入門)
    3. 刪除數組第一個元素(入門)
    4. 數組合並(入門)
    5. 添加元素(簡單)
    6. 計數(入門)
    7. 查找重複元素(中等)
    8. 求二次方(入門)
    9. 查找元素位置(入門)
    10. 避免全局變量(入門)

引言

牛客網這個前端筆試題庫,可以說這60道是最基礎的了,也是考察的東西比較雜,有時間4天差不多就可以刷完,鞏固基礎還是有些用的。做完題回顧一上午就可以過完一遍。現在我結合我的答案和參考的其他人的答案,在這裏做一個總結,也是自己知識的整理結果。

21. 刪除數組最後一個元素

題目描述
刪除數組 arr 最後一個元素。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4]
輸出:[1, 2, 3]

其他簡單方法就不寫了

// 最常用的方法
function truncate(arr) {
    return arr.slice(0,-1)
}

// 方法二:返回新數組API + pop()
function truncate(arr) {
    let newArr = [].concat(arr)
    newArr.pop()
    return newArr
}

相關知識點:

  • 數組API

22. 添加元素

題目描述
在數組 arr 開頭添加元素 item。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4], 10
輸出:[10, 1, 2, 3, 4]

// 方法一:先把最後一個放進去,然後遍歷數組
function prepend(arr, item) {
    let newArr = [item]
    for(let i = 0; i < arr.length ; i++) {
        newArr.push(arr[i])
    }
    return newArr
}

// 方法二:copy新數組,把item添加到第一個
function prepend(arr, item) {
    let arr1 = arr.slice(0)
    arr1.splice(0, 0, item) // arr1.unshift(item)
    return arr1
}

// 方法三:直接使用concat返回新數組
function prepend(arr, item) {
    return [item].concat(arr)
}

相關知識點:

  • 數組API

23. 刪除數組第一個元素

題目描述
刪除數組 arr 第一個元素。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4]
輸出:[2, 3, 4]

// 方法一: for循環push元素
function curtail(arr) {
    let newArr = []
    for(let i = 1; i < arr.length ; i++) {
        newArr.push(arr[i])
    }
    return newArr
}

// 方法二:copy原數組,刪除元素返回
function curtail(arr) {
    let newArr = arr.slice(0)
    newArr.shift()
    return newArr
}

// 方法三:直接slice截取返回新數組
function curtail(arr) {
    return arr.slice(1)
}

相關知識點:

  • 數組方法API

24. 數組合並

題目描述
合併數組 arr1 和數組 arr2。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4], ['a', 'b', 'c', 1]
輸出:[1, 2, 3, 4, 'a', 'b', 'c', 1]

// 方法一: 迭代
function concat(arr1, arr2) {
    var newArr=arr1.slice(0);
    for(var i=0;i<arr2.length;i++){
        newArr.push(arr2[i]);
    }
    return newArr;
}

// 方法二:數組合並
function concat(arr1, arr2) {
    return arr1.concat(arr2)
}

相關知識點:

  • 數組API

25. 添加元素

題目描述
在數組 arr 的 index 處添加元素 item。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4], 'z', 2
輸出:[1, 2, 'z', 3, 4]

// 方法一:普通迭代
function insert(arr, item, index) {
    let newArr = []
    for(let i = 0;i < arr.length; i++) {
        if(i === index) {
            newArr.push(item)
            newArr.push(arr[i])
        } else {
            newArr.push(arr[i])
        }
    }
    return newArr
}

// 方法二:新數組+splice方法
function insert(arr, item, index) {
    let newArr = arr.slice(0)
    newArr.splice(index,0,item)
    return newArr
}

// 方法三:拼數組
function insert(arr, item, index) {
    // 根據index分成兩個數組然後concat拼接
    return arr.slice(0,index).concat(item,arr.slice(index))
}

相關知識點:

  • 數組API

26. 計數

題目描述
統計數組 arr 中值等於 item 的元素出現的次數
輸入:[1, 2, 4, 4, 3, 4, 3], 4
輸出:3

// 方法一:計數器
function count(arr, item) {
    let count = 0
    arr.forEach((value,index) => {
        if(value === item) count++
    })
    return count
}

// 方法二:filter過濾了等於item的,最後返回數組長度
function count(arr, item) {
    let newArr = arr.filter(val => val === item)
    return newArr.length
}

// 方法二:reduce
function count(arr, item) {
  return arr.reduce((prev, val) => {
    return val === item ? ++prev : prev
  }, 0)
}

相關知識點:

  • 數組API

27. 查找重複元素

題目描述
找出數組 arr 中重複出現過的元素
輸入:[1, 2, 4, 4, 3, 3, 1, 5, 3]
輸出:[1, 3, 4]

// 方法一:數組排序,雙指針如果相鄰的相等就放到結果數組中
function duplicates(arr) {
    if(arr.length < 2) return arr
    let newArr = arr.slice(0).sort()
    let result = []
    let i = 0
    let j = 1
    while(j < newArr.length) {
        if(newArr[i] === newArr[j]){
            if(!result.includes(newArr[i])) result.push(newArr[i])
        } else {
            i = j
        }
        j++
    }
    return result
}

// 方法二:使用map記錄count,把大於1的輸出
function duplicates(arr) {
    let map = new Map()
    arr.forEach(value => {
        if (map.has(value)) {
          let count = map.get(value)
          map.set(value,++count)
        } else {
          map.set(value,1)
        }
    })
    let arr1 = []
    for(let [key,index] of map) {
      if(map.get(key) > 1) arr1.push(key)
    }
    return arr1
}

// 方法三:只有一個的概念就是第一次出現的索引和第二次出現的索引不同
function duplicates(arr) {
    let newArr = []
    arr.forEach((value, index) => {
        if(arr.indexOf(value) !== arr.lastIndexOf(value) && newArr.indexOf(value) === -1) newArr.push(value)
    })
    return newArr
}

相關知識點:

  • 算法題:雙指針
  • 計數器
  • 索引

28. 求二次方

題目描述
爲數組 arr 中的每個元素求二次方。不要直接修改數組 arr,結果返回新的數組
輸入:[1, 2, 3, 4]
輸出:[1, 4, 9, 16]

題設,就是爲map準備的,牛客不太支持ES6以上的語法,目前不支持 ** ,不過正常是可以用的。

// 方法一:map
function square(arr) {
    // 平方可以 Math.pow(value, 2)  ,也可以 value ** 2
    return arr.map(value => value * value)
}

// 方法二:forEach:如何用forEach實現map,就這麼寫
function square(arr) {
    let newArr = []
    arr.forEach((value, item) => {
        newArr.push(value * value)
    })
    return newArr
}

相關知識點:

  • 數組map方法,以及map的方法實現
  • 平方的寫法

29. 查找元素位置

題目描述
在數組 arr 中,查找值與 item 相等的元素出現的所有位置
輸入:['a','b','c','d','e','f','a','b','c'] 'a'
輸出:[0, 6]

// 方法一:forEach,其他的遍歷都大同小異,一定是要遍歷就對了。
function findAllOccurrences(arr, target) {
    let newArr = []
    arr.forEach((value,index) => {
        if(target === value) newArr.push(index)
    })
    return arr1
}

相關知識點:

  • 數組API

30. 避免全局變量

題目描述
給定的 js 代碼中存在全局變量,請修復

function globals() {
    myObject = {
      name : 'Jory'
    };

    return myObject;
}
// 方法一: myObject前面加var/let/const都可以
function globals() {
    const myObject = {
      name : 'Jory'
    };

    return myObject;
}

相關知識點:

  • 作用域

不加聲明的是全局變量,容易引起全局污染。作用域分爲全局作用域、函數作用域,ES6新增了塊級作用域。

數組方法終於過完了~~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章