每日算法:整理字符串(队列字符出入栈)

219 阅读1分钟

题目:

image.png

题解

一, JS API

Math.abs(); // 获取绝对值
String.prototype.charCodeAt() // 获取字符 ASCII 码值

字符的 ASCII 码值

'a'.charCodeAt() //97
'A'.charCodeAt() //65

'b'.charCodeAt() //98
'B'.charCodeAt() //66

∵ 同一小写字母与大写字母相减 为 ±32 ∴ 当s[i]与s[i-1]是同一字母,且只有一个是大写时:

 Math.abs(s[i].charCodeAt()-s[i-1].charCodeAt())===32

队列入栈

var makeGood = function (str) {
 // 队列 q 存输入,栈 s 存输出,都用数组表示
 let q = str.split(''),s = [];
 
 // 迭代队列
 while (q.length) {
    
    // 出队字符
    let curS = q.shift()

    // 出队字符ASCII
    let curV = curS.charCodeAt()
    
    // 栈尾字符ASCII
    let preV = s[s.length - 1] && s[s.length - 1].charCodeAt()

    // 如果出队字符与栈尾字符 符合题意需要删除的条件
    if (preV && Math.abs(curV - preV) === 32) {
      
      // 出栈
      s.pop()
    } else {

      // 入栈
      s.push(curS)
    }
 }
 
// 输出
 return s.join('')
}