var isValid = function(s) { s = s.split('') let len = s.length; if (s % 2) returnfalse let map = newMap([ [')', '('], [']', '['], ['}', '{'] ]) let stack = [] for (let i of s) { if (map.get(i)) { if ( stack[stack.length - 1] !== map.get(i) ) { returnfalse } else { stack.pop() } } else { stack.push(i) } } return !stack.length }
正整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。 X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。 给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
functionrevserTransform(word, mark = '-') { return word.replace(/([A-Z])/g, `${mark}$1`).replace(/(\w)+g/, mark).toLowerCase().slice(1) } // test revserTransform('ContentType', '@') // content@type // test revserTransform('ContentType', '-') // content-type
验证回文
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
1 2
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
1 2
输入: "race a car" 输出: false
解法一: 迭代循环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/** * @param {string}s * @return {boolean} */ var isPalindrome = function(s) { if(typeof s != 'string') return s = s.toString() if(s.length < 2) returntrue var r = /[a-zA-Z0-9]/g; var arr = s.match(r) || []; let j = arr.length - 1 for (let i = 0; i < j; i ++, j --) { if (arr[i].toLowerCase() != arr[j].toLowerCase()) { returnfalse } } returntrue };
利用正则表达式^以及replace优化下
1 2 3 4 5 6 7 8 9 10 11 12 13
var isPalindrome = function(s) { if(typeof s != 'string') return s = s.toString() if(s.length < 2) returntrue var r = /[^a-zA-Z0-9]/ig; var arr = s.replace(r, '').toLowerCase() let j = arr.length - 1 for (let i = 0; i < j; i ++, j --) { if (arr[i] != arr[j]) { returnfalse } } returntrue };
解法二: String.prototype.reverse()
1 2 3 4 5 6 7
var isPalindrome = function(s) { if(typeof s != 'string') return s = s.toString() if(s.length < 2) returntrue var r = /[^a-zA-Z0-9]/ig; s = s.replace(r, '').toLowerCase() return s == s.split('').reverse().join('') };
var permute = nums => { var len = nums.length if (nums.length < 2) return nums var res = [] var path = [] var backTrack = (path, nums) => { if (path.length === nums.length) { res.push(path) } for (let num of nums) { if (!path.includes(num)) { path.push(num) backTrack(path.slice(), nums) path.pop() } } } backTrack(path, nums) return res } permute([1,2,3,4])
计算容器的面积
暴力解法 O(n^2)
1 2 3 4 5 6 7 8 9
var maxArea = function(height) { var max = 0 for(let i = 0; i < height.length - 1;i ++) { for (let j = i+ 1; j < height.length; j ++) { max = Math.max(max, Math.min(height[i], height[j]) * (j - i)) } } return max };
双指针解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14
var maxArea = function(height) { var max = 0 var left = 0 var right = height.length - 1 while(left < right) { max = Math.max(max, Math.min(height[right], height[left]) * (right - left)) if (height[right] > height[left]) { left ++ } else { right -- } } return max };
functionmoveZeroes(nums: number[]): void{ var len = nums.length while(len --) { var index = nums.indexOf(0) if (index > -1) { nums.splice(index, 1) nums.push(0) } } };
无重复字符的最长子串
给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
functionlengthOfLongestSubstring(s: string): number{ var max = 0 var res = [] var sArr = s.split('') for (let i = 0; i < sArr.length; i ++) { var temp = sArr[i] var index = res.indexOf(temp) res.push(temp) if (index > -1) { res.splice(0, index + 1) } max = Math.max(max, res.length) } return max };
functionmaxSubArray(nums) { var sum = 0 var ans = nums[0] for (let num of nums) { if (sum > 0) { sum = sum + num } else { sum = num; } ans = Math.max(sum, ans) } return ans }; // test var nums = [-2,1,-3, 4,-1,2,1,-5,4] maxSubArray(nums)