博客原文地址: https://finget.github.io/2019...
給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。 示例 1: 輸入: 123 輸出: 321 示例 2: 輸入: -123 輸出: -321 示例 3: 輸入: 120 輸出: 21 注意: 假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。
思路:數字變字符串再變數組,這個主要就是運用的數組的經常使用api了,pop
、shift
、 unshift
、join
。javascript
/** * @param {number} x * @return {number} */ var reverse = function(x) { let arr = (x + '').split('').reverse() let len = arr.length // 最大最小邊界 let min = -(2**31) let max = (2**31) - 1 if (arr[len - 1] == '-') { arr.pop() if (arr[0] == 0) { arr.shift() arr.unshift('-') let res = Number(arr.join('')) return res>=min&&res<=max?res:0 } else { arr.unshift('-') let res = Number(arr.join('')) return res>=min&&res<=max?res:0 } } else if (arr[0] == '0' && arr[len - 1] != '-') { arr.shift() let res = Number(arr.join('')) return res>min&&res<max?res:0 } else { return Number(arr.join(''))>min&&Number(arr.join(''))<max?Number(arr.join('')):0 } };
給定一個字符串,找到它的第一個不重複的字符,並返回它的索引。若是不存在,則返回 -1。 案例: s = "leetcode" 返回 0. s = "loveleetcode", 返回 2. 注意事項:您能夠假定該字符串只包含小寫字母。
思路:for of
循環,找出字符出現的第一個位置和最後一個位置,若是兩個值相等,則返回前端
/** * @param {string} s * @return {number} */ var firstUniqChar = function(s) { for (let v of s) { if (s.indexOf(v) === s.lastIndexOf(v)) return s.indexOf(v) } return -1 };
給定一個字符串,你須要反轉字符串中每一個單詞的字符順序,同時仍保留空格和單詞的初始順序。 示例 1: 輸入: "Let's take LeetCode contest" 輸出: "s'teL ekat edoCteeL tsetnoc" 注意:在字符串中,每一個單詞由單個空格分隔,而且字符串中不會有任何額外的空格。
主要就是用到了數組的split
、reverse
、join
、map
方法,原理:就是把字符串變成數組,再利用數組自帶的反轉方法,最後再變成字符串返回。java
export default (str) => { // 1.先將字符串轉爲數組 let arr = str.split(' ') // 2.遍歷數組,反轉數組中的每一項 let result = arr.map(item => { return item.split('').reverse().join('') }) // 3.把新生成的數組轉成字符串,用空格分開,返回結果 return result.join(' ') } // 合併寫法 export default (str) => { return s.split(/\s/g).map(item => { return item.split('').reverse().join('') }).join(' ') }
給定一個字符串 s,計算具備相同數量0和1的非空(連續)子字符串的數量,而且這些子字符串中的全部0和全部1都是組合在一塊兒的。 重複出現的子串要計算它們出現的次數。 示例 1 : 輸入: "00110011" 輸出: 6 解釋: 有6個子串具備相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。 請注意,一些重複出現的子串要計算它們出現的次數。 另外,「00110011」不是有效的子串,由於全部的0(和1)沒有組合在一塊兒。 示例 2 : 輸入: "10101" 輸出: 4 解釋: 有4個子串:「10」,「01」,「10」,「01」,它們具備相同數量的連續1和0。 注意: - s.length 在1到50,000之間。 - s 只包含「0」或「1」字符。
思路:使用一個for
循環,將字符串從第一個開始傳入match
函數中,在match
函數中利用正則表達式獲取到字符串開頭的字符(或是多個0或是多個1),再使用repeat
方法,將開頭獲取到的多個0或1利用異或運算反轉重複相同次數(舉個例子:獲取到了‘00’
,那麼反轉以後就是‘11’
),而後再創建一個正則表達式,將獲取到的字符和反轉後的字符拼接,使用test方法與傳入的字符串進行比對,返回第一個比對成功的字符串,保存到數組r
中。以此類推,剃掉原字符串的第一個字符後再調用一次match
方法,直到原字符串只剩下1個字符,返回數組r
的長度,即爲題解。git
export default (str) => { // 創建數據結構,堆棧,保存數據 let r = [] // 給定任意子輸入都返回第一個符合條件的子串 let match = (str) => { // 使用正則表達式獲取字符串開頭的字符 let j = str.match(/^(0+|1+)/)[0] // 利用「異或」運算將字符反轉並複製相同個數 let o = (j[0] ^ 1).toString().repeat(j.length) // 合併上面兩個字符串,建立正則表達式 let reg = new RegExp(`^(${j}${o})`) // 與傳入的字符串進行比對,返回第一個比對成功的子串 if (reg.test(str)) { return RegExp.$1 } else { return '' } } // 經過for循環控制程序運行的流程 for (let i = 0, len = str.length - 1; i < len; i++) { let sub = match(str.slice(i)) if (sub) { r.push(sub) } } return r.length }
給定兩個字符串 s 和 t ,編寫一個函數來判斷 t 是不是 s 的一個字母異位詞。 示例 1: 輸入: s = "anagram", t = "nagaram" 輸出: true 示例 2: 輸入: s = "rat", t = "car" 輸出: false 說明: 你能夠假設字符串只包含小寫字母。 進階: 若是輸入字符串包含 unicode 字符怎麼辦?你可否調整你的解法來應對這種狀況?
思路:若是兩個字符串包含的字母相同,那麼排序的順序也應該同樣,基於此作循環判斷。github
/** * @param {string} s * @param {string} t * @return {boolean} */ var isAnagram = function(s, t) { let s1 = s.split('').sort() let t1 = t.split('').sort() if (s1.length != t1.length) { return false } for(let i = 0;i<s1.length;i++) { if (s1[i]!=t1[i]) { return false } } return true };
建立了一個前端學習交流羣,感興趣的朋友,一塊兒來嗨呀!正則表達式