1.题目无特殊要求,所以可以使用两个字符数组。 str 数组用来保存输入字符串,target 数组用来保存需要输出的答案字符串。
2.定义变量 k,只用来表示目标数组 target 的下标。用变量 i 遍历原数组 str,用变量 j 遍历 str[i] 之后且与 str[i] 连续相同的字符。
3.如果 j-i>1 说明 str[i] 之后有与之相同的连续字符,那么目标数组就应该保存连续重复的字符 str[i],同时保存重复的次数 j-i;否则,说明 str[i] 之后无与之重复的字符,那么只需要存入该字符就。
4.遍历时,下标 i 的更新问题。当目标数组跟新完后,就让 i 更新为 j;因为 str[j] 之前的字符都是连续重复的,那么就不需要让i再去遍历那些重复的字符。所以直接让 i 指向与之不同的字符 str[j] 的下标j。
5.遍历完数组 str 后,目标数组 target 和下标 k (k表示元素个数) 也跟新完成。那么就应该在目标数组 target 放入字符结束标志'\0',至此就得到了答案,输出数组 target;
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
char str[502]; //输入字符串数组
char target[502]; //更改后的字符串数组
int k=0; //target数组的下标
scanf("%s",str);
int len=strlen(str); //输入字符串长度
for(int i=0;i<len;) //遍历输入字符串数组,*****主义没写i++;
{
int j=i;
while(str[i]==str[j]) //str数组的第i个字符后有多少个连续重复的
{
j++;
}
if(j-i>1) //如果连续重复的数量大于1个,则要更新数字
{
target[k++]=str[i]; //先存入连续重复的字符
target[k++]=(j-i)+'0';//在存入重复次数,j-i为整形,所以+'0'转化为数字字符
}
else //第i个字符后,没有连续重复字符
{
target[k++]=str[i];
}
i=j; //因为str[j]之前的字符都与str[i]重复,那就无需再i++;直接使下标i指
//向与str[i]不同的元素下标
}
target[k]='\0'; //数组更新完后,把字符串结束标志'\0'存入目标数组target的末尾
if(k==len) //k为目标数组target的长度,如果与原数组长度相同,则不能压缩
printf("NO");
else //可以压缩
printf(target);
return 0;
}