JavaScript數據結構與算法-String-(leetcode原題)

博客原文地址: https://finget.github.io/2019...

反轉整數

給出一個 32 位的有符號整數,你須要將這個整數中每位上的數字進行反轉。

示例 1:

輸入: 123
輸出: 321
 示例 2:

輸入: -123
輸出: -321
示例 3:

輸入: 120
輸出: 21
注意:

假設咱們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231,  231 − 1]。請根據這個假設,若是反轉後整數溢出那麼就返回 0。

思路:數字變字符串再變數組,這個主要就是運用的數組的經常使用api了,popshiftunshiftjoinjavascript

/**
 * @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" 
注意:在字符串中,每一個單詞由單個空格分隔,而且字符串中不會有任何額外的空格。

主要就是用到了數組的splitreversejoinmap方法,原理:就是把字符串變成數組,再利用數組自帶的反轉方法,最後再變成字符串返回。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
};

最後

建立了一個前端學習交流羣,感興趣的朋友,一塊兒來嗨呀!
正則表達式

相關文章
相關標籤/搜索