一道面试题
2021/7/21 23:06:05
本文主要是介绍一道面试题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
/** * 根据表达式计算字母数 * 说明: * 给定一个描述字母数量的表达式,计算表达式里的每个字母实际数量 * 表达式格式: * 字母紧跟表示次数的数字,如 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 思路不对,应该可以生成一颗树!!!
这篇关于一道面试题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-10百万架构师第十三课:源码分析:Spring 源码分析:Spring核心IOC容器及依赖注入原理|JavaGuide
- 2025-01-10便捷好用的电商API工具合集
- 2025-01-09必试!帮 J 人团队解决物流错发漏发的软件神器!
- 2025-01-09不容小觑!助力 J 人物流客服安抚情绪的软件!
- 2025-01-09为什么医疗团队协作离不开智能文档工具?
- 2025-01-09惊叹:J 人团队用啥软件让物流服务快又准?
- 2025-01-09如何利用数据分析工具优化项目资源分配?4种工具推荐
- 2025-01-09多学科协作难?这款文档工具可以帮你省心省力
- 2025-01-09团队中的技术项目经理TPM:工作内容与资源优化策略
- 2025-01-09JIT生产管理法:优化流程,提升竞争力的秘诀