leetcode
Feng Wuqian
万丈高楼平地起,苦练前端基本功
展开
-
JS链表逆置
js链表逆置原创 2022-11-21 16:56:16 · 412 阅读 · 0 评论 -
leetcode561. 数组拆分 I(Javascript)
var arrayPairSum = function(nums) { nums.sort((a,b)=>a-b) let result=0 for(let i=0;i<nums.length;i+=2){ result+=nums[i] } return result};时间复杂度O(N),空间复杂度O(1)原创 2021-09-14 11:16:02 · 153 阅读 · 0 评论 -
leetcode506. 相对名次(Javascript)
一法(效率较低):1.备份原数组,将原数组排序2.遍历排序后的数组,用indexOf从大到小找出元素在原数组中的索引3.判断索引值在result中加入对应答案二法(效率较高):1.备份原数组,将原数组排序2.遍历排序后的数组,用index判断位置并在哈希表中设置对应键值3.遍历原数组,用原数组对应哈希表取出值加入到result中二法由于使用了哈希表替代了indexOf,所以避免了时间复杂度O(n2)的情况,时间复杂度低了一个层次var findRelativeRanks = functi.原创 2021-09-13 11:14:49 · 140 阅读 · 0 评论 -
leetcode500. 键盘行(Javascript)
思路:建立三个集合,遍历数组,将每一项转化为小写字母,遍历改项,记录首位字母所属集合,并用type标记,之后每一个字符若所属集合和首位字母不一致,则删除其所在words的元素,返回words注意:要break的不要使用三目运算符,filter,map无法continue,最好使用for循环,switch(item)中的case之后无法进行方法调用返回var findWords = function(words) { let set1=new Set('qwertyuiop') let..原创 2021-09-10 15:38:02 · 113 阅读 · 0 评论 -
leetcode482. 密钥格式化(Javascript)
思路:去横杠转大写加入头部遍历加入剩余项和横杠注意点:加入头部时判断字符串长度是否小于于k,决定是否加入横杠遍历时最后一项不用加横杠var licenseKeyFormatting = function(s, k) { let newS=s.replace(/-/g,'') function replaceStr(str){ let strArr=[...str] for(let i=0;i<strArr.length;i++){ .原创 2021-09-07 17:56:22 · 156 阅读 · 0 评论 -
leetcode409. 最长回文串(Javascript)
var longestPalindrome = function(s) { //将数组排序 let sArr=[...s].sort() //定义所需变量,用ifOne来判断是否已加最中间的奇数项 let [sum,ifOne,cunrrentNum]=[0,false,1] //循环处理,计算字符重复次数且根据奇偶性加进总量 for(let i=0;i<sArr.length;i++){ if(sArr[i]===sArr[i+1]){ .原创 2021-09-06 11:20:27 · 132 阅读 · 0 评论 -
leetcode387. 字符串中的第一个唯一字符(Javascript)
思路:凡是问出现次数的,不要犹豫,用hash,此题直接遍历字符串记录每个字母的出现次数,记录到map中,然后遍历map返回value为1的key的索引原创 2021-08-18 11:56:33 · 131 阅读 · 0 评论 -
leetcode290. 单词规律(Javascript)
思路:双哈希表法,创建两个Map类型分别存储规律->字符串,字符串->规律,每次遍历都验证两个表是否已经存在对应值,如果不存在则添加var wordPattern = function(pattern, s) { let map1=new Map() let map2=new Map() let strArr=s.split(" ") if(strArr.length!==pattern.length){ return false } for(let i=0;i<.原创 2021-08-11 18:06:25 · 116 阅读 · 0 评论 -
leetcode205. 同构字符串(Javascript)
思路:创建两个哈希表分别存储s对应t的映射和t对应s的映射,每次添加映射时都判断字符是否同构,两个哈希表都要过var isIsomorphic = function(s, t) { if(s.length!==t.length){ return false }let map1=new Map()let map2=new Map()for(let i=0;i<s.length;i++){ if(map1.has(s[i])){ if(ma.原创 2021-08-09 14:07:22 · 150 阅读 · 0 评论 -
leetcode125. 验证回文串(Javascript)
思路:先用正则去除非字母和非数字字符,再遍历数组,比较开头和结尾对应的字符是否相等,一旦不相等返回false,要处理字符串长度小于等于1的情况,直接返回truevar isPalindrome = function(s) { if(s.length<=1){ return true }let str=s.replace(/[^a-zA-Z0-9]*/g,'')if(str.length<=1){return true}let lastStr=''f.原创 2021-08-05 11:39:15 · 95 阅读 · 0 评论 -
leetcode67. 二进制求和
var addBinary = function(a, b) { // 取a,b最大长度 let max=Math.max(a.length,b.length) // 取a,b长度差值 let dValue=Math.abs(b.length-a.length) // 计算当前和,判断是否进位 let currentSum=0 // 保存进位 let preSum=0 // 数组处理后转换成字符串返回 let backs=[].原创 2021-08-04 11:36:48 · 101 阅读 · 0 评论 -
leetcode58. 最后一个单词的长度(Javascript)
思路:用split方法切割字符串,再用循环从后向前扫描,一旦发现元素不为空(长度大于0),就返回该元素的长度,返回值就是最后一个单词的长度var lengthOfLastWord = function(s) {var sArr=s.split(" ")for(let i=sArr.length-1;i>=0;i--){if(sArr[i].length>0){return sArr[i].length}}return 0}...原创 2021-08-03 10:25:24 · 104 阅读 · 0 评论 -
leetcode20. 有效的括号(Javascript栈标准解法)
标准栈解法:判断括号的有效性可以使用「栈」这一数据结构来解决。我们遍历给定的字符串 ss。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号,那么字符串 ss 无效,返回 \text{False}False。为了快速判断括号的类型,我们可以使用哈希表.原创 2021-07-30 11:29:51 · 160 阅读 · 0 评论 -
leetcode14. 最长公共前缀(Javascript)
纵向扫描法:按照公共前缀的特征可知从数组中首个字符串的首个字母往第二个字符串的首个字符依次向下比较都会相等,如果不相等则公共前缀字母到此结束var longestCommonPrefix = function(strs) { // 横向扫描递归,纵向扫描// 理解好题目的意思,明确公共前缀有什么特点和最长有什么特点,可以得出什么条件let result=''if(strs.length===0){ return ''}else if(strs.length===1){ r.原创 2021-07-29 13:59:40 · 95 阅读 · 0 评论 -
leetcode463. 岛屿的周长(Javascript)
本题是经典的做题步骤,1.定义保存结果的变量。2.特殊情况处理。3.循环+分支(循环中需要处理特殊情况)得出结果var islandPerimeter = function(grid) {// 定义保存周长的变量let girth=0// 特殊情况处理if(!grid.length){ return 0}// 定义保存四个边长的变量let a=b=c=d=0// 循环+分支处理,周长就是从四个不同方向的投影长度for(let i=0;i<grid.length;i++)..原创 2021-07-23 14:16:10 · 168 阅读 · 1 评论 -
leetcode455.分发饼干(Javascript)
var findContentChildren = function(g, s) { // 定义能吃到饼干的孩子的数量 let num=0 // 特殊情况处理,任意数组长度为零直接返回0 if(!g.length||!s.length){return 0}g.sort((a,b)=>a-b),s.sort((a,b)=>a-b)// 循环处理(贪心算法,每次取局部最优解)for(let i=0,j=0;i<g.length&&j&l..原创 2021-07-23 11:30:01 · 202 阅读 · 2 评论 -
leetcode349+350.两个数组的交集I+II(Javascript实现)
349:时间复杂度O(n),空间复杂度O(n)输出结果中元素唯一,我们就可以用es6中的集合has方法,对nums1和nums2分别使用一次,最后将结果用Array.from变成数组返回/** * @param {number[]} nums1 * @param {number[]} nums2 * @return {number[]} */var intersection = function(nums1, nums2) {let arr1=new Set(nums1)let arr2原创 2021-07-21 10:42:48 · 82 阅读 · 1 评论 -
leetcode303. 区域和检索 - 数组不可变(Javascript实现)
个人感觉这一题对优化的思维模式锻炼很有帮助,从刷题到实战都有一定借鉴性,值得研究暴力解法:每次调用sumRange就去遍历数组中i->j并计算总和,缺点在于每一次调用sumRange都要遍历i->,多次调用时效率低** 优化思路(渐进式):1、初始化时先求出所有sumRange的和(每次调用sumRange就只要O(1)时间复杂度,但求出所有sumRange消耗较大),所以此方法有待优化。2、先求出所有前缀和,sumRange的结果只要用前缀和计算一次得出,求前缀和的消耗较小,且sumRan原创 2021-07-20 11:45:31 · 151 阅读 · 0 评论 -
leetcode228. 汇总区间(Javascript实现)
思路:两层while循环,内层遍历出数组中的不间断区间,添加到新的数组中并删除原数组被添加项,外层判断原数组是否已经为空,为空则退出循环,最后返回新数组,时间复杂度O(n),空间复杂度O(1),代码如下:/** * @param {number[]} nums * @return {string[]} */var summaryRanges = function(nums) {let currentIndex=0let backs=[]while(nums.length>0){w..原创 2021-07-20 10:04:26 · 153 阅读 · 0 评论 -
leetcode136. 只出现一次的数字(JS暴力解法+位运算解法)
暴力解法:时间复杂度O(n^2),额外用了O(1)的空间// 在原数组内删除重复项,再返回数组的第一项var singleNumber = function(nums) {for(let i=0;i<nums.length;i++){ if(i===nums.length-1) nums[nums.length-1] for(let j=i+1;j<nums.length;j++){ if(nums[i]===nums[j]){ //如果.原创 2021-07-16 10:34:53 · 227 阅读 · 0 评论 -
leetcode121. 买卖股票的最佳时机(JS虚拟内存不足写法,理论可行)
暴力解法:遍历出所有利润,保存到一个数组当中,再对数组进行排序,返回数组最大值,此方法理论可行,但是实际操作中会出现虚拟内存不足的报错,仅供学习/** * @param {number[]} prices * @return {number} */var maxProfit = function(prices) { let backs=[] if(prices.length<=1){ return 0 }for(let i=0;i<=pri..原创 2021-07-15 11:03:55 · 108 阅读 · 0 评论 -
leetcode118. 杨辉三角(JS实现)
观察可知每个嵌套数组中除首末两项之外(判断处理这两种特殊情况即可),中间的值都由上一个数组的当前索引项和前一索引项相加,例如:bakcs[3][1]=backs[2][1]+backs[2][0]或者bakcs[4][2]=backs[3][2]+backs[3][1],故可用双指针法得出算法:backs[i][j]=backs[i-1][j-1]+backs[i-1][j]/**@param {number} numRows@return {number[][]}*/var genera.原创 2021-07-15 09:58:06 · 193 阅读 · 0 评论 -
LeetCode108. 将有序数组转换为二叉搜索树--JS实现
108. 将有序数组转换为二叉搜索树问题的关键:选取合适的根节点,让构建出来的树,左右节点分布尽量均匀/** * Definition for a binary tree node. * function TreeNode(val, left, right) { * this.val = (val===undefined ? 0 : val) * this.left = (left===undefined ? null : left) * this.right =原创 2021-07-14 13:49:16 · 180 阅读 · 0 评论