130926:华为2014校园招聘
9月5日,华为2014校园招聘的机试题目
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
输入pInputStr: 输入字符串lInputLen: 输入字符串长度
输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
1 #include <stdio.h> 2 void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr){ 3 int i = 1, j = 0, num = 1; 4 char temp = pInputStr[0]; 5 while(i < lInputLen) { 6 if(pInputStr[i] == temp) { 7 num++; 8 i++; 9 } 10 else { 11 if(num > 1) { 12 pOutputStr[j++] = '0' + num; 13 } 14 pOutputStr[j++] = temp; 15 temp = pInputStr[i]; 16 num = 1; 17 i++; 18 } 19 } 20 if(num > 1) { 21 pOutputStr[j++] = '0' + num; 22 } 23 pOutputStr[j++] = temp; 24 pOutputStr[j] = '\0'; 25 printf("%s", pOutputStr); 26 } 27 void main(){ 28 char in[100]; 29 char out[100]; 30 char temp; 31 long i = 0; 32 while((temp=getchar())!='\n') { 33 in[i++] = temp; 34 } 35 in[i]='\0'; 36 stringZip(in, i, out); 37 }
心得:如果不是机试的话,就当前处理代码的算法,可能会漏了22~24行。