/**
* 根据表达式计算字母数
* 说明:
* 给定一个描述字母数量的表达式,计算表达式里的每个字母实际数量
* 表达式格式:
* 字母紧跟表示次数的数字,如 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 countOfLetters(letters) {
/** 代码实现 */
const lettersArr = letters.split('')
const result = {}
let length = lettersArr.length
let arr = []
let status = 0
let innerObj = {}
const isLetter = (s) => !/[^A-Za-z]/.test(s)
const isNumber = (s) => !/[^0-9]/.test(s)
const isLeft = (s) => s === '('
const isRight = (s) => s === ')'
const objAdding = (code,number) => {
result[code] =(result[code] || 0) + number
}
const innerObjAdding = (code,number) => {
innerObj[code] =(innerObj[code] || 0) + number
}
while(length--){
const code = lettersArr[length]
if(status === 0){
if(isLetter(code)){
objAdding(code,1)
arr = []
status = 0
continue;
}
if(isNumber(code)){
arr.unshift(code)
status = 1
continue;
}
if(isRight(code)){
arr.unshift(code)
status = 2
continue;
}
}
if(status === 1){
if(isLetter(code)){
objAdding(code,+arr.join(''))
arr = []
status = 0
continue;
}
if(isNumber(code)){
arr.unshift(code)
status = 1
continue;
}
if(isRight(code)){
arr.unshift(code)
status = 2
continue;
}
}
if(status === 2){
if(isLeft(code)){
const index = arr.findIndex(item => item === ')')
const str = arr.slice(0,index).join('')
const obj = countOfLetters(str)
arr = arr.slice(index + 1)
let s
for(let i = 0;i < arr.length;i++){
if(!isNumber(arr[i])){
break;
} else {
s = i+1
}
}
const pointerNumber = +arr.slice(0,s).join('') || 1
arr = arr.slice(s)
const keys = Object.keys(obj)
keys.map(key => {
innerObjAdding(key,obj[key])
})
const innerKeys = Object.keys(innerObj)
innerKeys.map(key => {
innerObj[key] = innerObj[key]*pointerNumber
})
if(arr.length === 0){
const keys = Object.keys(innerObj)
keys.map(key => {
objAdding(key,innerObj[key])
})
innerObj = {}
status = 0
}
continue;
}
arr.unshift(code)
}
}
return result
}
console.log(countOfLetters('A2B3'))
console.log(countOfLetters('A(A3B)2'))
console.log(countOfLetters('C4(A(A3B)2)2'))```
// TODO 思路不对,应该可以生成一颗树!!!
一道面试题
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
一道腾讯面试题
一道腾讯面试题
腾讯 休闲 面试题 腾讯面试题 面试题答案 -
每日一道面试题 - 02
每日一题:从阿里,腾讯,百度,美团,头条等大厂技术题目中选取有价值得题目,对题目考察目标进行分析,并给出参考答案。每日一题,在不知不觉中进步,欢迎留言区打卡 !问题:已知...
数据结构 二分法 基础算法 牛顿迭代法 github -
一道阿里面试题
有1,2,3....n个数组,每个数组包含一系列一维线段的表示,每个数组的元素结构为
数组 #include i++