leetcode-面试题01.06 字符串压缩

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串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;
}
发布了19 篇原创文章 · 获赞 1 · 访问量 3124

猜你喜欢

转载自blog.csdn.net/qq_41603639/article/details/104897024