这几天看到了谷歌对中国2014年毕业生出的一道编程题,我自己试着做了一下,还是感觉谷歌出的题都比较有趣,和实际都有一些联系,我将其大概意思翻译成中文,并附上自己写的code。
Prolbem:
对于读一串数字,每个人都有自己的风格。我们的手机号都是11位数,不同的人如何有不同的读法,有人按3-4-4的方式读,有人按3-5-3的方式读,还有人按3-3-5的方式读,平时在问及他人手机号的时候,都会遇到这种情况。举个例子:像手机号15212336667,有人就会说152 1233 6667,有人就会说152 12336 667等。但在英语中,如果你按照152 1233 6667来报号码的时候,都会这样说:one five two, one two double three, triple six seven。 所以问题就来了,如何让计算机能够像人一样根据不同的读取规则智能地读一串数字呢?
问题条件:
1. 单独不连续的数字就单个读;
2. 2个连续就用double;
3. 3个连续就用triple;
4. 4个连续就用quadruple;
5. 5个用quintuple;
6. 6个用 sextuple;
7. 7个用septuple;
8. 8个用octuple;
9. 9个用nonuple;
10. 10个用decuple;
11. 如果多余10个连续的数字,就分别单个读取。
如下图为输入和输出的格式样例,输入的第一行表示有几个输入样例,其中每个样例包括数字串和读取数字的格式:
解决方法:
我的解决方法就是根据读取格式将数字串进行分割,对分割后的每个部分进行单独处理,处理的时候就是进行匹配,如果连续两个相同,就对应输出double,然后跟上相应的数子,一次类推。。。。。。如果大侠们有什么地方可以改进的,请指导指导小弟!
下面是主要处理函数的代码:
#define PLUSLOOP(I, N) for (UINT I = 0; I < (N); ++I) char ten[10][6]={"zero","one","two","three","four","five","six","seven","eight","nine"}; char name[11][10]={"","","double","triple","quadruple","quintuple","sextuple","septuple","octuple","nonuple","decuple"}; void ReadPhoneNumber(string phoneNum, string format) { int n = 0, m = 0; istringstream num(format); while( num >> n ) { for( int i = m, k; i < m+n; i=k ) { for( k = i+1; k < m+n; k++ ) if( k< phoneNum.size() && phoneNum[i] != phoneNum[k] ) break; if( k-i < 2 || k-i > 10 ) PLUSLOOP(p,k-i) cout<<ten[phoneNum[i]-'0']<<' '; else cout<<name[k-i]<<' '<<ten[phoneNum[i]-'0']<<' '; } m += n; } cout<<endl; }