列圧縮。基本的な文字列の圧縮を達成するための方法で書かれた定期的な文字の数を、使用します。例えば、文字列aabcccccaaaはa2b1c5a3になります。文字列は短くない「圧縮」した場合、元の文字列が返されます。あなたは、文字列のみ小文字(a〜z)のが含まれているとことがあります。
思考
前とダブルポインタが決定された後、同数プラスワン等しいです。詳細どのように我々は最初の整数の桁数を決定することができ、かつ各文字が+で、逆の順序で保存されているように文字列にint型の変数は、ここで、ライブラリ関数itoaはを使用しないようにどのように文字の数、に新しい文字列の後にそれが存在「0」このように、整数ユニット文字形式に変換し、次に文字のアレイに記憶されます。繰り返し文字の数が多すぎると、プラスチック製のオーバーフローがあるかもしれない、オーバーフローの基本的なタイプを考慮することが重要ではありませんが、この問題は存在しないので、問題は、もう5ワット文字より与えられています。しかし、私はchar型の直接の使用は、このフォームで「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;
}