一道面试题的简单思考

2021/7/27 23:10:29

本文主要是介绍一道面试题的简单思考,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

/**

  • 根据表达式计算字母数
  • 说明:
  • 给定一个描述字母数量的表达式,计算表达式里的每个字母实际数量
  • 表达式格式:
  • 字母紧跟表示次数的数字,如 A2B3
  • 括号可将表达式局部分组后跟上数字,(A2)2B
  • 数字为1时可缺省,如 AB3。
  • 示例:
  • countOfLetters('A2B3'); // { A: 2, B: 3 }
  • countOfLetters('A(A3B)2'); // { A: 7, B: 2 }
  • countOfLetters('C4(A(A3B)2)2'); // { A: 14, B: 4, C: 4 }
    */
function multipleToken(tokenStr, multiple) {
    return `${tokenStr.substr(0,1)}${tokenStr.substr(1)*multiple}`
}

// tokens array
function flatToken(tokens) {
    const flatToken = []

    function isOverFlag(str) {
        return /\)/.test(str)
    }

    for (let i = 0; i < tokens.length; i++) {

        if (isOverFlag(tokens[i])) {
            let newToken = []
            let popToken = flatToken.pop()
            while (popToken != '(') {
                newToken.push(multipleToken(popToken, tokens[i].substr(1)))
                popToken = flatToken.pop()
            }
            flatToken.push(...newToken)
        } else {
            flatToken.push(tokens[i])
        }
    }
    return flatToken
}


function getValueFromFlatToken(flatToken) {
    const obj = {}
    flatToken.forEach((item) => {
        if (!obj[item.substr(0, 1)]) obj[item.substr(0, 1)] = 0
        obj[item.substr(0, 1)] += (+item.substr(1) || 1)
    })
    return obj
}

function prase(str) {
    const tokens = []
    let tokenStr = ''

    function emitToken() {

        if (tokenStr) {
            if (tokenStr.length == 1) tokenStr += '1'
            tokens.push(tokenStr)
            tokenStr = ''
        }
    }
    for (let i = 0; i < str.length; i++) {
        const letter = str.substr(i, 1)
        if (letter == '(') {
            emitToken()
            tokens.push('(')
            continue
        }
        if (letter == ')') {
            emitToken()
            tokenStr += letter
            continue
        }
        const isLetter = (s) => !/[^A-Za-z]/.test(s)
        if (isLetter(letter)) {
            emitToken()
            tokenStr += letter
            continue
        }
        tokenStr += letter
    }
    emitToken()

    return tokens

}

function countOfLetters(letters) {
    // prase
    // flatToken
    // getValueFromFlatToken
    return getValueFromFlatToken(flatToken(prase(letters)))
}



这篇关于一道面试题的简单思考的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程