前端算法题汇总一

因为最近听去面试的朋友说,前端面试有问到算法题.发现自己之前完全没关注过着方面的知识,所以打算每天看一两道积累一下

我的题都是在力扣上看的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))

 

6. 获取数组中连续子数组最大和 ,给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 (这里也求了最大和的连续子数组,不过没在力扣验证,不知道是否完善)

  const getMaxArr = (arr) => {
    let max = 0
    let sum = arr[0]
    let newArr = [arr[0]]
    let index = -1
    arr.some((item, i) => {
      if (item < 0 && max + item < 0) {
        newArr = []
      } else {
        newArr.push(item)
      }
      max = Math.max(max + item, item)
      if (max > sum) {
        index = newArr.length
      }
      sum = Math.max(max, sum)

    })
    const maxarr = newArr.slice(0, index)
    console.log(sum, maxarr) //17 (6) [5, -5, 6, -2, 10, 3]
  }
  getMaxArr([1, -2, 5, -5, 6, -2, 10, 3])

 

posted @ 2021-03-15 15:53  潇湘羽西  阅读(619)  评论(0编辑  收藏  举报