c语言 规则是:主持人给出一串字符串,要求把这串字母简化.,华为校园招聘机试题--字符串压缩解析!...

通过键盘输入一串小写字母(a~z)组成的字符串。

请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。

压缩规则:

1、仅压缩连续重复出现的字符。比如字符串”abcbc”由于无连续重复字符,压缩后的字符串还是”abcbc”。

2、压缩字段的格式为”字符重复的次数+字符”。例如:字符串”xxxyyyyyyz”压缩后就成为”3x6yz”。

示例

输入:“cccddecc”   输出:“3c2de2c”

输入:“adef”     输出:“adef”

输入:“pppppppp” 输出:“8p”

主要说来就是进行字符串处理类的问题,主要涉及到:

1.字符串的输入与输出;

2.基本常用的C语言的字符串的函数使用;

3.对于多重情况的考虑;

4.将数字转换成字符串并进行拼接;

下面我将给出两个版本的程序代码:(注意华为的机试环境是VC++ 6.0)

#include

#include

using namespace std;

int main()

{

string str , result;

cout << "Please Enter a string:" << endl;

cin >> str;

size_t length = str.length();

size_t i = 0, j = 0, count = 0;

while(true)

{

if(i < length && str[j] == str[i])

{

count++;

i++;

}

else

{

if(count > 1)

{

/*

主要是将较大的数值转换成字符串,这里要考虑的全面,

有的同学没有考虑到数值较大,直接使用'0'+count,这个是不对的!

*/

char temp[10] = {'\0'};

itoa(count,temp,10);

result.append(temp);

result.append(str,j,1);/*这里也要注意,对于C++中的string.append的几个函数的操作*/

}

else

{

if(count == 1)

result.append(str,j,1);

}

j = i;

if(j == length)

break;

count = 0;

}

}

cout << "the result is : ";

cout << result << endl;

return 0;

}

下面这个是C语言版本的,其实思想是一样的,主要的一些基本函数的使用,其实对于本题来说,使用C语言进行操作,执行流程也很清晰,并且操作速度较快!

#include

#include

#include

int main()

{

char str[100] = {'\0'};

char res[100] = {'\0'};

scanf("%s",str);

int length = strlen(str);

int i=0, j=0, k=0;

int count = 0;

do

{

if(i < length && str[i++] == str[j])

count++;

if(str[i] != str[j])

{

if(count <= 1)

res[k++] = str[j];

else

{

if(count > 1)

{

char temp[10] = {'\0'};

itoa(count,temp,10);

strcpy(res+k,temp);

k+=strlen(temp);

res[k++] = str[j];

}

}

j = i;

count = 0;

}

}while(i

res[k] = '\0';

printf("The result is : %s\n",res);

return 0;

}

在考试期间,发现一些同学对于基本的do{ ... }while(...);循环的基本控制条件使用的总是出问题,希望本科的毕业生,要熟练的掌握基本的循环结构,我们不能连最基本的框架都写错了!

希望查看博客的同学,可以一起晒一晒你的思路和方法,有没有更加简洁的代码,让我们共同提高!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值