字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
思路
双指针判断前后是否相等,相等数目加1。细节在于在新串存入字符之后如何存字符数量,int型变量如何转换为字符串,这里不让用库函数itoa,所以我们可以先判断整数的位数,然后逆序存储每位字符,通过+'0’这种方式来将单位整数转化为字符形式,再存入字符数组。重要的是要考虑基本类型溢出,如果重复字符数目过大,则可能存在整形溢出,但题目给出不超过5w个字符,所以不存在此问题。但我之前想直接用char类型来定义count,定义为’1’这种形式,后来又没改,导致有一个测试用例一直没通过,后来发现,char型溢出了,出现了内存错误。
char* compressString(char* s){
int len=strlen(s);
char* new_s=(char*) malloc(sizeof(char)* (len*2+1));
if(*s=='\0') return "";
char ch=s[0];
int index=0;
int count=1; //这里,之前用的char count=1; 导致有一个case一直不通过
for(int i=1;i<=len;i++){
if(ch==s[i]){ //之前指针与当前指针比较,灵活运用for循环
count++;
}
else{
new_s[index++]=ch;
int num=(int) log10(count),num1=num; //计算位数,倒序存入数组
while(count){
new_s[index+num]=count%10+'0';
count/=10;
num--;
}
index+=num1+1;
count=1;
ch=s[i];
}
}
new_s[index]='\0';
if(len>index){
return new_s;
}
return s;
}