增减字符串匹配
增减字符串匹配
由范围 [0,n] 内所有整数组成的 n + 1 个整数的排列序列可以表示为长度为 n 的字符串 s ,其中:如果 perm[i] < perm[i + 1] ,那么 s[i] == ‘I’如果 perm[i] > perm[i + 1] ,那么 s[i] == ‘D’给定一个字符串 s ,重构排列 perm 并返回它。如果有多个有效排列 perm,则返回其中 任何一个 。
输入:s = “IDID”输出:[0,4,1,3,2]
输入:s = “III”输出:[0,1,2,3]
12345678910111213var diStringMatch = function(s) { const n = s.length, ans = new Array() let left = 0, right = n for(let i = 0; i < n; i++) { if(s.charCodeAt(i) === 'I'.charCodeAt(0)) { ...
交换后字典序最小的字符串
交换后字典序最小的字符串
给你一个仅由数字组成的字符串 s,在最多交换一次 相邻 且具有相同 奇偶性 的数字后,返回可以得到的字典序最小的字符串。如果两个数字都是奇数或都是偶数,则它们具有相同的奇偶性。例如,5 和 9、2 和 4 奇偶性相同,而 6 和 9 奇偶性不同。
输入: s = “45320”输出: “43520”解释:s[1] == ‘5’ 和 s[2] == ‘3’ 都具有相同的奇偶性,交换它们可以得到字典序最小的字符串。
输入: s = “001”输出: “001”
12345678910var getSmallestString = function(s) { let arr=s.split("")//将字符串转成数组,方便操作 for(let i=1;i<arr.length;i++){//从前向后遍历数组 if(((arr[i]%2===0&&arr[i-1]%2===0)||(arr[i]%2!==0&&arr[i-1]%2!==0))&&a ...
字符串中的第一个唯一字符
字符串中的第一个唯一字符
给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在,则返回 -1 。
输入: s = “leetcode”输出: 0
输入: s = “loveleetcode”输出: 2
123456789101112131415161718192021var firstUniqChar = function(s) { // 创建一个哈希表对象 let map = new Map() // 统计次数 for (let i = 0; i < s.length; i++) { let word = s.charAt(i) let val = map.get(word) if (map.has(word)) { map.set(word, val + 1) } else { map.set(word, 1) } } / ...
稀疏数组搜索
稀疏数组搜索
编写一种方法,对字符串数组进行排序,将所有稀疏数组搜索合在一起。变位词是指字母相同,但排列不同的字符串。注意:本题相对原题稍作修改
输入: words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,”dad”, “”, “”], s = “ta”输出:-1说明: 不存在返回-1。
输入:words = [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”, “”,”dad”, “”, “”], s = “ball”输出:4
12345678910111213141516var findString = function(words, s) { let [low, high] = [0, words.length - 1]; while (low <= high) { let mid = (low + high) >> 1; // 处理空字符串 while (mid > lo ...
亲密字符串
亲密字符串
给你两个字符串 s 和 goal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false 。交换字母的定义是:取两个下标 i 和 j (下标从 0 开始)且满足 i != j ,接着交换 s[i] 和 s[j] 处的字符。例如,在 “abcd” 中交换下标 0 和下标 2 的元素可以生成 “cbad” 。
输入:s = “ab”, goal = “ba”输出:true解释:你可以交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 相等。
输入:s = “ab”, goal = “ab”输出:false解释:你只能交换 s[0] = ‘a’ 和 s[1] = ‘b’ 生成 “ba”,此时 s 和 goal 不相等。
123456789101112131415161718var buddyStrings = function(s, goal) { // 一. 两字符串长度不等, 直接返回false if(s.length !== goal.length) r ...
括号的分数
括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。
输入: “()”输出: 1
输入: “(())”输出: 2
1234567891011121314151617181920212223var scoreOfParentheses = function(s) { var stack = [] for (var i = 0; i < S.length; i++) { if (S[i] === '(') stack.push('(') if (S[i] === ')') { if (stack[stack.length - 1] === '(') { stack.pop() stack.push(1) } else { ...
破解闯关密码
破解闯关密码
闯关游戏需要破解一组密码,闯关组给出的有关密码的线索是:一个拥有密码所有元素的非负整数数组 password密码是 password 中所有元素拼接后得到的最小的一个数请编写一个程序返回这个密码。
输入: password = [15, 8, 7]输出: “1578”
输入: password = [0, 3, 30, 34, 5, 9]输出: “03033459”
123var crackPassword = function(password) { return password.sort((a,b) => ('' + a + b) - ('' + b + a)).join('');};
存在重复元素 III
存在重复元素 III
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。
输入:nums = [1,2,3,1], k = 3, t = 0输出:true
输入:nums = [1,0,1,1], k = 1, t = 2输出:true
12345678var containsNearbyAlmostDuplicate = function(nums, k, t) { for (let i = 0; i < nums.length; i++) { for (let j = i + 1; j <= i + k && j < nums.length; j++) { if (Math.abs(nums[j] - nums[i]) <= t) return ...
字符串的最大公因子
字符串的最大公因子
对于字符串 s 和 t,只有在 s = t + t + t + … + t + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。
输入:str1 = “ABCABC”, str2 = “ABC”输出:”ABC”
输入:str1 = “ABABAB”, str2 = “ABAB”输出:”AB”
1234567891011121314151617181920212223242526272829303132333435363738394041var gcdOfStrings = function(str1, str2) { const m=str1.length; const n=str2.length; let t=''; let j=1; let maxlen=0; let str=str1; let min=n if(m<n) ...
计算器
计算器
给定一个包含正整数、加(+)、减(-)、乘(_)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+, - ,_,/ 四种运算符和空格 。 整数除法仅保留整数部分。
输入: “3+2*2”输出: 7
输入: “ 3/2 “输出: 1
123456789101112131415161718192021222324var calculate = function(s) { let sign = '+', n = 0, c, stack = []; for (let i = 0; i <= s.length; i++) { c = s.charAt(i); if (c === ' ') continue; if (c <= '9' && c >= '0') { n = n * 10 + parseInt(c); co ...