js筆試算法題 字符串壓縮、字符串解壓縮


// 壓縮字符串 'aaaaaabbbbbcccca' => 'a6b5c4a1'
function compressStr(strs = 'aaaaaabbbbbccccaa') {
  let pre = strs[0]
  let curNum = 1
  let res = ''
  for (let i = 1; i < strs.length; i++) {
    const str = strs[i]
    if (str === pre) {
      curNum++
    } else {
      res += pre
      res += curNum
      pre = str
      curNum = 1
    }
  }
  res += pre
  res += curNum
  return res.length > strs.length ? strs : res
}
compressStr()

// 輸入:s = "3[a]2[bc]"
// 輸出:"aaabcbc"
const decodeString = (s = "3[a]2[bc]") => {
  let numStack = [] // 存倍數的棧
  let strStack = [] // 存 待拼接的str 的棧
  let num = 0 // 倍數的“搬運工”
  let result = '' // 字符串的“搬運工”
  for (const char of s) {
    // 逐字符掃描
    if (/\d/.test(char)) {
      // 遇到數字
      num = num * 10 + Number(char) // 算出倍數
    } else if (char == '[') {
      // 遇到 [
      strStack.push(result) // result串入棧
      result = '' // 入棧后清零
      numStack.push(num) // 倍數num進入棧等待
      num = 0 // 入棧后清零
    } else if (char == ']') {
      // 遇到 ],兩個棧的棧頂出棧
      let repeatTimes = numStack.pop() // 獲取拷貝次數
      result = strStack.pop() + result.repeat(repeatTimes) // 構建子串
    } else {
      result += char // 遇到字母,追加給result串
    }
  }
  return result
}
decodeString()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM