【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)
-
描述
易信是由网易和电信联合开发的一款即时通讯软件。除了语音聊天,免费电话等新功能以外,传统的文字信息聊天功能也得以保留,因此每天都有大量的文字信息需要在服务器中存储,中转。

小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。
- 样例输入
-
4 (AA)2A ((A2B)2)2G WANGYI A2BC4D2
- 样例输出
-
5 13 6 9
#include "stdio.h"
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int pow( int n)
{
int result =1;
if (n == 0)
{
return 1 ;
}
else {
for ( int i = 0 ; i < n; ++i )
{
result *= 10 ;
}
}
return result ;
}
int main() {
int n;
string str;
cin >> n ;
while (n--) {
cin >> str;
stack <char> stack1;
stack <char> stack2;
bool isleft = false;
bool isbacket = false;
int result = 0;
for ( int i = 0 ; i < str.length (); ++ i)
{
if ( str[i ] == '(' )
{
isleft = true ;
stack1 .push( str[i ]);
}
else if (str[i ]==')')
{
int multi = 1;
int count = 0;
bool hasnum=false;
while ( stack1.size () > 0 && stack1.top ()!= '(' )
{
if ( stack1.top () >= '0' && stack1.top () <= '9' )
{
multi += ( stack1.top () - '0' ) * pow(count ) - 1;
count ++;
hasnum = true ;
stack1 .pop();
}
else if (stack1.top () >= 'A' && stack1.top () <= 'Z' )
{
if ( hasnum)
{
result += multi;
multi = 1 ;
count = 0 ;
hasnum = false ;
}
else {
result ++;
}
stack1 .pop();
}
}
if ( isbacket&& hasnum && stack1.top() == '(' )
{
result *= multi;
isbacket = false ;
hasnum = false ;
}
stack1 .pop();
if ( stack1.empty ())
{
isleft = false ;
}
}
else {
int multi = 1;
int count = 0;
bool hasnum = false;
if ( isleft)
{
if ( str[i ] >= '0' && str[i ] <= '9' && str[i - 1 ] == ')')
{
isbacket = true ;
}
stack1 .push( str[i ]);
}
else if (str[i ]>= '0' && str[i ] <= '9')
{
if ( str[i -1] == ')'&& isbacket == false)
{
isbacket = true ;
}
stack2 .push( str[i ]);
if (( str[i +1]>= 'A' && str[i +1]<= 'Z')|| str [i+ 1] == '\0')
{
while (! stack2.empty ())
{
multi += ( stack2.top () - '0' )* pow( count) -1;
count ++;
stack2 .pop();
}
}
if ( isbacket)
{
result = multi* result;
isbacket = false ;
}
else {
result += multi;
hasnum = true ;
}
}
else if (str[i ] >= 'A' && str[i ] <= 'Z' )
{
isbacket = false ;
result ++;
}
if ( hasnum)
{
result --;
}
}
}
cout << result << endl;
}
}
【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)的更多相关文章
- 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...
- 【面试笔试算法】Program 3 : Complicated Expression(网易游戏笔试题)
时间限制:50000ms 单点时限:5000ms 内存限制:256MB 描述 在lisp语言中,表达式都用前缀法表示,例如,1 + 2 在lisp中使用(+ 1 2)来表示,其中,表达式的括号是必需的 ...
- 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...
- 【面试笔试算法】Program 6: 字符消除(hiho题库)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1) ...
- 【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串
(一)题目 问题:求给定字符串s的回文(palindrome)子串中,长度最大的回文子串的长度. 回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的.比如" ...
- 【面试笔试算法】牛客网一站通Offer编程题2016.4.19
牛客网一站通offer (一)字符串变形 1. 题目: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello Wor ...
- 【面试笔试算法】Problem 8: 然而沼跃鱼早就看穿了一切(hiho题库)
时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼("marshtom ...
- 【面试笔试算法】Problem 7: 补提交卡(hiho题库)
时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了,小Ho查看自己的提交 ...
- 【面试笔试算法】Problem 1 : DP滑雪问题--网易互联网算法实习生2017笔试题
Description Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激.可是 为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
随机推荐
- 【安卓开发】Android为什么选择binder
Binder (Android技术内幕): 在上面这些可供选择的方式中,Android使用得最多也最被认可的还是Binder机制. 为什么会选择Binder来作为进程之间的通信机制呢?因为Binder ...
- Windows2008 R2上完全卸载Oracle操作步骤
Windows2008 R2上完全卸载Oracle操作步骤 1.关闭Oracle所有的服务,按[win+R]运行[services.msc]找到所有Oracle开头的服务,点击停止. 2.使用Orac ...
- android拍照获得图片及获得图片后剪切设置到ImageView
ok,这次的项目需要用到设置头像功能,所以做了个总结,直接进入主题吧. 先说说怎么 使用android内置的相机拍照然后获取到这张照片吧 直接上代码: Intent intentFromCapture ...
- PyCharm 开发Django ,错误汇总
近期略微接触了一下Django.在学习的过程中可谓是坎坎坷坷,遇到了很多的问题. 下面就来谈一谈我对Django的一点点的见解. Django项目的创建 使用PyCharm来开发Django项目是非常 ...
- 5、Android Service测试
如果你在应用中使用了Service,你应该来测试这个Service来确保它正常工作.你可以创建仪表测试来验证Service的行为是否正确:比如,service保存和返回有效的数值并正常的处理数据. A ...
- sql中InnoDB和MyISAM的区别
InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型 1,MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持等高级处理,往往被认为只适合小项目:而 ...
- dbcp连接池不合理的锁导致连接耗尽
应用报错,表象来看是连接池爆满了. org.springframework.transaction.CannotCreateTransactionException: Could not open J ...
- MySQL设计软件登录模块
学了一段时间的Java了,思量着做一点简单的小模块的东西吧,于是就有了下面的这个简单的小案例. 大致实现的功能就是注册于登录还有就是用到了一点,分层思想.仅此而已,所以非常的适合新手围观. 建立好数据 ...
- 【安卓中的缓存策略系列】安卓缓存策略之综合应用ImageLoader实现照片墙的效果
在前面的[安卓缓存策略系列]安卓缓存之内存缓存LruCache和[安卓缓存策略系列]安卓缓存策略之磁盘缓存DiskLruCache这两篇博客中已经将安卓中的缓存策略的理论知识进行过详细讲解,还没看过这 ...
- 使用JavaScript动态的添加组件
使用JavaScript进行动态的网页窗体组件的添加是一件很方便也很容易实现的事情.话不多说,边看代码边做解释吧. 准备工作 由于html页面中不可以添加java代码,所以我在jsp页面中进行了测试. ...