leecode刷题(2021-12-23)
1.两数之和
1 /** 2 * @param {number[]} nums 3 * @param {number} target 4 * @return {number[]} 5 */ 6 var twoSum = function(nums, target) { 7 for(let i=0;i<nums.length;i++){ 8 let rest = target - nums[i] 9 nums[i] = NaN 10 if(nums.includes(rest)){ 11 let index = nums.indexOf(rest) 12 return [i,index] 13 } 14 } 15 };
2.回文数
1 /** 2 * @param {number} x 3 * @return {boolean} 4 */ 5 var isPalindrome = function(x) { 6 if(x===0) return true 7 if(x<0 || x%10===0) return false 8 let str = x.toString() 9 if(str.split('').reverse().join('')===str){ 10 return true 11 }else{ 12 return false 13 } 14 };
3.罗马数字转整形
1 /** 2 * @param {string} s 3 * @return {number} 4 */ 5 var romanToInt = function(s) { 6 let total = 0 7 let romanArr = s.split('') 8 for (let i=0;i<romanArr.length;i++) { 9 if(romanArr[i]+romanArr[i+1] === 'IV'){ 10 total += 4 11 i++ 12 continue 13 } 14 if(romanArr[i]+romanArr[i+1] === 'IX'){ 15 total += 9 16 i++ 17 continue 18 } 19 if(romanArr[i]+romanArr[i+1] === 'XL'){ 20 total += 40 21 i++ 22 continue 23 } 24 if(romanArr[i]+romanArr[i+1] === 'XC'){ 25 total += 90 26 i++ 27 continue 28 } 29 if(romanArr[i]+romanArr[i+1] === 'CD'){ 30 total += 400 31 i++ 32 continue 33 } 34 if(romanArr[i]+romanArr[i+1] === 'CM'){ 35 total += 900 36 i++ 37 continue 38 } 39 if(romanArr[i] === 'I'){ 40 total += 1 41 continue 42 } 43 if(romanArr[i] === 'V'){ 44 total += 5 45 continue 46 } 47 if(romanArr[i] === 'X') 48 { 49 total += 10 50 continue 51 } 52 if(romanArr[i] === 'L'){ 53 total += 50 54 continue 55 } 56 if(romanArr[i] === 'C'){ 57 total += 100 58 continue 59 } 60 if(romanArr[i] === 'D'){ 61 total += 500 62 continue 63 } 64 if(romanArr[i] === 'M'){ 65 total += 1000 66 continue 67 } 68 } 69 return total 70 };
4.最长公共前缀
1 /** 2 * @param {string[]} strs 3 * @return {string} 4 */ 5 var longestCommonPrefix = function(strs) { 6 let index = -1 7 let minLength = 300 8 let res = "" 9 const newArr = [] 10 strs.forEach(item =>{ 11 if(minLength>item.length) minLength = item.length 12 newArr.push(item.split('')) 13 }) 14 for(let i=0;i<minLength;i++){ 15 if(newArr.every(item=>{return item[i] === newArr[0][i]})) { 16 index = i 17 }else{ 18 break 19 } 20 } 21 if(index === -1){ 22 return "" 23 }else{ 24 for(let j=0;j<=index;j++){ 25 res += newArr[0][j] 26 } 27 return res 28 } 29 };
5.有效的括号
1 /** 2 * @param {string} s 3 * @return {boolean} 4 */ 5 var isValid = function(s) { 6 const arr = s.split('') 7 const stack = [] 8 let flag = true 9 if(arr.length%2!==0){ 10 return false 11 } 12 arr.forEach(item =>{ 13 if(item==='(' || item==='[' || item ==='{'){ 14 stack.push(item) 15 }else{ 16 if(item === ')'){ 17 if (stack.pop()!=='(') flag = false //这里用return不起作用,还待研究 18 } 19 if(item === ']'){ 20 if (stack.pop()!=='[') flag = false 21 } 22 if(item === '}'){ 23 if (stack.pop()!=='{') flag = false 24 } 25 } 26 }) 27 if(stack.length===0){ 28 return true && flag 29 }else{ 30 return false 31 } 32 33 };
6.存在重复元素
1 /** 2 * @param {number[]} nums 3 * @return {boolean} 4 */ 5 var containsDuplicate = function(nums) { 6 return nums.length === [...new Set(nums)].length ? false : true 7 };
7.最大子数组和
我的暴力解法超时,但也想记录一下,代码如下:
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var maxSubArray = function(nums) { 6 let max = -Infinity 7 let temp = 0 8 if(nums.length===1){ 9 return nums[0] 10 } 11 for(let i=0;i<nums.length;i++){ 12 temp =nums[i] 13 if(max<temp){ 14 max = temp 15 } 16 for(let j=i+1;j<nums.length;j++){ 17 temp = temp+nums[j] 18 if(max<temp){ 19 max = temp 20 }else{ 21 continue 22 } 23 } 24 } 25 return max 26 };
动态规划方法:
1 /** 2 * @param {number[]} nums 3 * @return {number} 4 */ 5 var maxSubArray = function(nums) { 6 let ans = nums[0]; 7 let sum = 0; 8 for(let num of nums) { 9 if(sum + num > num ){ 10 sum = sum + num; 11 } else { 12 sum = num; 13 } 14 ans = Math.max(ans, sum); 15 }; 16 return ans; 17 };

浙公网安备 33010602011771号