因為最近聽去面試的朋友說,前端面試有問到算法題.發現自己之前完全沒關注過着方面的知識,所以打算每天看一兩道積累一下
我的題都是在力扣上看的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))