一.先看题目:
题目:
编写一种方法,实现基本的字符串压缩功能。
比如,字符串aabcccccaaa会变为a2b1c5a3。
假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字符串。
小白的摸爬滚打心酸史,如有大佬请自行略过。
花了一个个晚上各种查资料,各种尝试,调试,最后终于跑出来了。wwww~~
二.思路
废话不多说,咱们先来看思路。
这里我想到的是在定义一个字符串数组b[],把要我们输出的结果储存在数组b[]中,然后把数组b[]给打印出来。
1.
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
//题目:
//编写一种方法,实现基本的字符串压缩功能。
// 比如,字符串aabcccccaaa会变为a2b1c5a3,
// 假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字串。
int main()
{
char a[100];
char b[100];
scanf("%s", a);
int l = strlen(a);
首先咱们先创建两个数组a和b ,a用来储存原来输入的字符串,b用来储存需要我们输出的字符串。
2.
int count = 1; //定义一个count,用来统计每一个字母的数量;
int flag = 0; //定义一个flag,用flag作为数组a[]遍历的变量;
因为一旦读取到一个字母,它的数量就为1,因此我们定义count初始值为1;
定义一个count,用来统计每一个字母的数量;
定义一个flag,用flag作为数组a[]遍历的变量;
3.
for (int j = 0; j < l; j++)
{
if (j % 2 == 0) //通过观察我们发现数组b中从0开始,偶数位为字母,奇数位为它的数量;
b[j] = a[flag]; //因此,我们设置变量j,当j为偶数时,我们把b[j]置为a[]中相应的字母;
else //当j为奇数时,我们把b[j]置为数字;
{
b[j] = count;
count = 1; //b[j]统计完一个字母的数字后,将count重新置为1;
flag++; //继续进行下一个字母的统计;
}
while (a[flag + 1] == a[flag])
{
count++;
flag++;
}
}
接下来是循环体部分,见上图代码中的注释,
感觉写的有点复杂了,可能各位大佬有更简便的方法
这里如果不好理解,可以举个例子具体算一遍,感受一下哈。
4.
int l2 = strlen(b);
if (l > l2)
{
for (int i = 0; i < l2; i++)
{
if (i % 2 == 0)
printf("%c", b[i]); //若数组b[j]中的元素为字母,用占位符%c输出;
else if (i % 2 == 1)
printf("%d", b[i]); //若数组b[j]中的元素为数字,要用占位符%d输出;
}
}
else
{
for (int i = 0; i < l; i++)
{
printf("%c", a[i]);
}
}
return 0;
}
最后一步了,这里一开始我打印数组b中的数字的时候用%c作为占位符,结果打印出来全是问号❓后面查资料才知道要用%d作为占位符,这里我真的哭死。。。。。
好了,这就是小白我的思路了,接下来给全代码:
#include<stdio.h>
#include<string.h> //题目:
//编写一种方法,实现基本的字符串压缩功能。
// 比如,字符串aabcccccaaa会变为a2b1c5a3,
// 假如压缩后的字符串的长度不小于原字符串的长度,则输出原来的字符串。
int main()
{
char a[100];
char b[100];
scanf("%s", a);
int l = strlen(a);
int count = 1; //定义一个count,用来统计每一个字母的数量;
int flag = 0; //定义一个flag,用flag作为数组a[]遍历的变量;
for (int j = 0; j < l; j++)
{
if (j % 2 == 0) //通过观察我们发现数组b中从0开始,偶数位为字母,奇数位为它的数量;
b[j] = a[flag]; //因此,我们设置变量j,当j为偶数时,我们把b[j]置为a[]中相应的字母;
else //当j为奇数时,我们把b[j]置为数字;
{
b[j] = count;
count = 1; //b[j]统计完一个字母的数字后,将count重新置为1;
flag++; //继续进行下一个字母的统计;
}
while (a[flag + 1] == a[flag])
{
count++;
flag++;
}
}
int l2 = strlen(b);
if (l > l2)
{
for (int i = 0; i < l2; i++)
{
if (i % 2 == 0)
printf("%c", b[i]); //若数组b[j]中的元素为字母,用占位符%c输出;
else if (i % 2 == 1)
printf("%d", b[i]); //若数组b[j]中的元素为数字,要用占位符%d输出;
}
}
else
{
for (int i = 0; i < l; i++)
{
printf("%c", a[i]);
}
}
return 0;
}