蓝桥杯204

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表示元素个数) 也跟新完成。那么就应该在目标数组 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;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

她没有救赎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值