2016网易游戏开发校招题目——Best Compression Algorithms
2015-09-16 22:44
543 查看
小Y是一名负责处理文字信息的易信工程师,每天他都要和字符串打交道。为了提高存储和传输效率,小Y在课余时间经常会去研究字符串的存储方法。通过内部使用的一种统一的加密算法,所有的文字信息首先都会被转化成只包含大写字母['A'...'Z']的字符串。为了压缩这个加密后的字符串,小Y最近想出了两个存储的规则:
(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想知道这个字符串原来的长度是多少,以此计算压缩倍率。你能帮助他吗?
第一行是整数T(T <= 100),表示下面有T组数据。之后T行,每行为一组数据,每组数据为一个字符串。
每个字符串只会包含26个大写字母['A'...'Z'],数字['0'...'9']和左右括号['(', ')']。
保证输入数据一定合法,括号内的模式串长度一定大于1,表示出现次数的数字一定大于1,且字符串长度L <= 100。
输出T行,每行对应一个数据的输出结果,表示字符串的实际长度。
保证每个字符串展开后的长度不超过109。
样例输入
样例输出
Solution: 典型的递归问题
有一点自己需要注意,拿到问题,最为重要的是构建起相对比较清晰的模型,当有Bug的时候,如果对思路不是很有把握,一定要回过头来重新审视模型,不要在细节中改来改去。
(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想知道这个字符串原来的长度是多少,以此计算压缩倍率。你能帮助他吗?
输入
第一行是整数T(T <= 100),表示下面有T组数据。之后T行,每行为一组数据,每组数据为一个字符串。每个字符串只会包含26个大写字母['A'...'Z'],数字['0'...'9']和左右括号['(', ')']。
保证输入数据一定合法,括号内的模式串长度一定大于1,表示出现次数的数字一定大于1,且字符串长度L <= 100。
输出
输出T行,每行对应一个数据的输出结果,表示字符串的实际长度。保证每个字符串展开后的长度不超过109。
样例输入
4 (AA)2A ((A2B)2)2G WANGYI A2BC4D2
样例输出
5 13 6 9
Solution: 典型的递归问题
#include <iostream> #include <unordered_set> #include <unordered_map> #include <vector> #include <queue> #include <stack> #include <limits> #include <sstream> #include <algorithm> #include <cstring> using namespace std; #define LOCAL int substrLen(string &s) { int cnt = 0; for(int i = 0; i < s.size(); ++i) { if(isalpha(s[i])) { cnt++; }else { cnt--; int num = 0; for(; i < s.size() && isdigit(s[i]); ++i) { num *= 10; num += s[i] - '0'; } if(i < s.size()) --i; cnt += num; } } return cnt; } int countNum(string &s, int &ind) {//每一层递归调用求的是括号内部的长度 int res = 0; string sstring = ""; for(; ind < s.size(); ++ind) { if(s[ind] == '(') { int innerLen = countNum(s, ++ind); int num = 0; for(++ind; ind < s.size() && isdigit(s[ind]); ++ind) { num *= 10; num += s[ind] - '0'; } if(ind < s.size()) --ind; res += num * innerLen; }else if(s[ind] == ')') { return res + substrLen(sstring); }else { sstring += s[ind]; } } if(sstring != "") return res + substrLen(sstring); else return res; } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif // LOCAL int t; scanf("%d", &t); string s; while(t--) { cin >> s; int ind = 0; cout << countNum(s, ind) << endl; } return 0; }
有一点自己需要注意,拿到问题,最为重要的是构建起相对比较清晰的模型,当有Bug的时候,如果对思路不是很有把握,一定要回过头来重新审视模型,不要在细节中改来改去。
相关文章推荐
- GoF的23种设计模式
- LSD-SLAM 编译过程(Ubuntu 14.04 + ROS Indigo)
- dpkg:处理google-chrome-stable(--install)时候出错
- 网易游戏2016校园招聘“游戏研发&平台开发”在线笔试——B题 Best Compression Algorithms
- golang指针
- uva 10618 Tango Tango Insurrection 动态规划
- Django模板系统
- Algorithms—239.Sliding Window Maximum
- poj2417 Baby-StepGiant-StepAlgorithm a^x=b%P
- 【hihoCoder】#1086: Browser Caching (微软笔试题)
- Algorithms—87.Scramble String
- django 1.8 官方文档翻译:7-3 Django管理文档生成器
- 电脑技巧---完全控制面板---上帝模式(God Mode)
- django 1.8 官方文档翻译:8-5 加密签名
- Google Gson 使用简介
- 【英语】Bingo口语笔记(86) - stand系列
- django 1.8 官方文档翻译:13-3 日志
- 博客园刷星golang v0.1
- ubuntu14.04 安装google chrome
- Django框架如何使用ajax的post方法