前端算法題匯總一


因為最近聽去面試的朋友說,前端面試有問到算法題.發現自己之前完全沒關注過着方面的知識,所以打算每天看一兩道積累一下

我的題都是在力扣上看的https://leetcode-cn.com/  這里面大多是Java,Python多,,這里把自己看的一些題記錄一下

ps: 題目力扣上都可以搜到,里面也有很多題解,我這里寫的解題只是我個人的解法,有的不完善,只是一個思路

1.給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 的那 兩個 整數,並返回它們的數組下標。

你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。

/**
 * 給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 的那 兩個 整數,並返回它們的數組下標。
  你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素不能使用兩遍。
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
//  var twoSum = function(nums, target) {
//   var a = [0]
//   nums.some((item, i) => {
//       if(nums.lastIndexOf(target - item) > i){
//           a = [i, nums.lastIndexOf(target - item)]
//           return true
//       }
//   })
//   return a.sort()
// };

// 其他解法
// var twoSum = function(nums, target) {
//   let len = nums.length;
//   // 創建 MAP
//   const MAP = new Map();
//   // 由於第一個元素在它之前一定沒有元素與之匹配,所以先存入哈希表
//   MAP.set(nums[0], 0);
//   for (let i = 1; i < len; i++) {
//       // 提取共用
//       let other = target - nums[i];
//       // 判斷是否符合條件,返回對應的下標
//       if (MAP.get(other) !== undefined) return [MAP.get(other), i];
//       // 不符合的存入hash表
//       MAP.set(nums[i], i)
//   }
// }

// console.log(twoSum([3,3,6], 6))

 

2.給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重復的三元組。

/**
 * 給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重復的三元組。

 * @param {number[]} num
 * @return {number[][]}
 */
var threeSum = function(num) {
  const nums = num.sort((a,b)=>{return a - b})
  let result = []
  let str = []
  const length = nums.length
  for (let i = 0; i < length-2; i++) {
    if (i > 0 && nums[i] === nums[i-1]) continue // 如果重復數據
    const a = nums[i]
    for (let j = i+1; j < length-1; j++) {
      if (j > i+1 && nums[j] === nums[j-1]) continue // 如果重復數據
      const b = nums[j]
      // console.log(str, `${a}${b}`, str.includes(`${a}${b}`))
      if (!nums.includes(-(a + b)) || str.includes(`${a}${b}`)) continue // 不存在和重復隊列
      for (let z = j+1; z < length; z++) {
        if (z > j+1 && nums[z] === nums[z-1]) continue // 如果重復數據
        const c = nums[z]
        // console.log(a,b,c)
        if (a + b + c === 0) {
          str.push(`${a}${b}`)
          result.push([a,b,c])
          break // 不能重復
        }
        
      }
      
    }
    
  }
  return result
}

console.log(threeSum([3,0,-6,-1,6,-5,-2, 0, 0,-3])) // [-6,-5,-3,-2,-1,0,0,3,6]

 

3.刪除數組中重復數據

/**
 * 刪除數組中重復數據
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
  nums.some((item,i)=>{
    if (nums.indexOf(item) !== i) {
      nums.splice(i, 1, 's')
    }
  })
  return nums.filter(item => item!=='s')
};

console.log(removeDuplicates([0,0,-1,4,-1,4,5,7,7,8]))

 

4.給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。

如果數組中不存在目標值 target,返回 [-1, -1]

/**
 * 給定一個按照升序排列的整數數組 nums,和一個目標值 target。找出給定目標值在數組中的開始位置和結束位置。
 如果數組中不存在目標值 target,返回 [-1, -1]
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
 var searchRange = function(nums, target) {
  if (!nums.length && !nums.includes(target)) return [-1, -1]
  return [nums.indexOf(target), nums.lastIndexOf(target)]
};

 

5.給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。

你可以假設數組中無重復元素

/**
 * 給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。
  你可以假設數組中無重復元素
 * @param {number[]} nums
 * @param {number} target
 * @return {number}
 */
 var searchInsert = function(nums, target) {
  if (nums.indexOf(target) > -1) {
    return nums.indexOf(target)
  }
  if (target > nums[nums.length-1]) {
    return nums.length
  }
  for (let i = 0; i < nums.length; i++) {
    if (nums[i] > target) return i
  }
};

console.log(searchInsert([1,2,4,6,7], 8))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM