2015网易游戏笔试02
来源:互联网 发布:java 并发 lock详解 编辑:程序博客网 时间:2024/05/10 19:26
题目链接
题目大意:
给定一个压缩后的字符串,求其解压缩之后的长度。
两个存储的规则:
(1)如果字符串中有连续相同的大写字母,它们可以选择用”字符+出现次数”的方式替代。如字符串’AABCCCCDD’,可以用’A2BC4D2’表示,也可以用’A2BC2C2DD’表示。
(2)如果字符串中有连续出现的模式串(模式串长度大于1),它们可以选择用”(模式)+出现次数”的方式替代。如字符串’FABCABCABCE’,可以用’F(ABC)3E’表示,也可以用’F(ABC)2ABCE’表示。
上述规则中的”连续”均指出现次数大于1,规则(2)中的括号后一定是一个大于1的数值,代表出现次数。
综合上述两个规则,字符串’AABAABFAABAABFG’可以用’((A2B)2F)2G’表示。小Y保证输出的压缩串符合上述的两个规则,以下类型的非法字符串不会出现:
‘(A)5’: 括号冗余
‘A1A4’: 数字1冗余
‘A((AA))2’: 括号冗余
(ABC)1: 括号和数字1冗余
对于给定的一个用上述规则压缩后的字符串,对应的原串是唯一的。小Y想知道这个字符串原来的长度是多少,以此计算压缩倍率。你能帮助他吗?
样例:
样例输入4(AA)2A((A2B)2)2GWANGYIA2BC4D2样例输出51369
思路:
维护一个栈,
- 遇到 ‘(’ 将当前累计长度先压栈,
- 遇到 ‘)’则需要考虑其后面的
数字串
,将当前长度乘倍,并且将 栈顶元素出栈,累加到当前的长度上,- 遇到A-Z,将当前长度 +1
- 遇到数字,代表前一个字符乘倍
代码:
#include <iostream>#include <fstream>#include <stack>using namespace std;//fstream resource("/Users/bingoboy/Downloads/cases.txt");int cnt;string tmp;stack<int> cstack;char buf[110];int main(){ int T; cin>>T; while(T--){ scanf("%s",buf); int cur=0,mul=0; stack<int> ntk; for(int i=0;buf[i];){ if(buf[i]=='(') { // CASE 1 ntk.push(cur); cur=0;mul=0; i++; }else if(buf[i]==')'){ // CASE 2 if(isdigit(buf[i+1])){ int j=i+1; while(isdigit(buf[j])){ mul=mul*10 + buf[j]-'0'; j++; } cur*=mul; mul=0; // 当前长度乘倍 i=j; }else{ i++; } cur+=ntk.top(); ntk.pop(); //栈顶元素出栈 ,累加到当前长度 }else if(isdigit(buf[i])){ // CASE 4 int j=i; while(isdigit(buf[j])){ mul=mul*10 + buf[j]-'0'; j++; } cur+=mul-1; mul=0; //前一个字符乘倍 i=j; }else{ //CASE3 cur++; i++; } } cout<<cur<<endl; } return 0;}/*int parentheses(string & aa){ if (aa.empty()) { return 0; } int fcnt = 0; int amount = 0; for (int i = 0; i < aa.size(); ++i) { if (aa[i] == '(') { cstack.push(fcnt); fcnt = 0; cstack.push(-1); continue; } if (aa[i] == ')') { ++i; while (aa[i] <= '9' && aa[i] >= '0') { amount = amount*10 + aa[i] - '0'; i ++; } i--; cstack.pop(); fcnt = amount * fcnt + cstack.top(); amount = 0; cstack.pop(); continue; } while (aa[i] <= '9' && aa[i] >= '0') { amount = amount*10 + aa[i] - '0'; i ++; } if (amount > 0) { fcnt += amount - 1; i --; amount = 0; continue; } fcnt += 1; } return fcnt;}int main(int argc, const char * argv[]) { cin >> cnt; while (cnt --) { cin >> tmp; cout << parentheses(tmp) << endl; } return 0;}*/
0 0
- 2015网易游戏笔试02
- 2015网易游戏笔试题01
- 2015网易游戏笔试题04
- 网易游戏笔试2015—字符串压缩
- 网易游戏笔试
- 网易游戏笔试回顾
- 2017网易游戏笔试
- 网易游戏2016在线笔试
- 2014网易游戏TTT笔试
- 网易笔试编程-数字游戏
- 2018网易游戏笔试题
- 2015网易游戏校园招聘笔试题 研发岗
- 2015网易游戏cc语音笔试部分题
- Difficult Player Grouping(2015网易游戏笔试题)
- Amusing Digits(2015网易游戏笔试题)
- Best Compression Algorithms(网易游戏2015笔试题)
- 网易游戏2015 在线笔试题(2)
- 网易游戏2015 在线笔试题(5)
- C++Primer 第五版 9.2节练习
- JSTL常用标签
- POI解析Excel,空行处理
- .NET基础--九九乘法表
- c++ Primer 第1~4章部分摘写。
- 2015网易游戏笔试02
- 轻松自动化---selenium-webdriver(python) (五)
- java二维码的生成,利用架包QRCode.jar
- Statement 对象
- SSH框架搭建小例
- 6 个下一代 Docker 监测工具-兄弟连IT教育
- autocad application 版本
- java中路径问题的总结
- magent编译报错error: event.h: No such file or directory