算法 C语言 压缩字符串

题目

给定一个字符数组chars,请使用下述算法压缩:
1.如果这个字符长度位1,直接返回
2.否则以字符+个数的形式
压缩后得到的字符出不直接返回,需要直接转储到字符数组chars中,返回该数组的新长度。

举例:
输入:chars=[‘a’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,‘b’,'b];
输出:返回 4. 输入数组chars=[‘a’,‘b’,‘1’,‘2’];
其中b有12个,但是以字符 1 和字符 2的形式存储。

1<=chars.length<=2000
chars[i]可以是小写英文字母、大写英文字母、数字或符号

解题思路

1.直接统计字符的个数
2.个数如果 >=9,需要先变成一个一个的数值,再转过来以字符的形式表示

具体代码

int compress(char* chars, int charsSize) {
    
    
    int i = 0;
   // char arr[2001];
    int num = 0;

    while (i < charsSize) {
    
    
        char c = chars[i];
        int count = 1;
        int k;
        if (i + 1 < charsSize) {
    
    
            k = i + 1;

            while (k < charsSize && chars[k] == c) {
    
    
                k++;
                count++;
            }

            chars[num++] = c;

           // printf("count=%d\n", count);

            if (count == 1) {
    
    

            }
            else {
    
    
                if (count <= 9) {
    
    
                    chars[num++] = count + '0';
                }
                else {
    
    
                    int x = 0;
                    int t[33];
                    while (count != 0) {
    
    
                        t[x++] = count % 10;
                        count /= 10;
                    }
                    for (int y = x-1; y>=0; y--) {
    
    
                        chars[num++] = t[y] + '0';
                    }


                }
            }


            i = k;


        }
        else {
    
    
            chars[num++] = c;
            i++;
        }

    }

    //for (int z = 0; z < num; z++) {
    
    
    //    printf("%c ", chars[z]);
    //}

    //printf("\n");

    return num;

}

全部代码

// yasuostring.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <stdio.h>

int compress(char* chars, int charsSize) {
    
    
    int i = 0;
   // char arr[2001];
    int num = 0;

    while (i < charsSize) {
    
    
        char c = chars[i];
        int count = 1;
        int k;
        if (i + 1 < charsSize) {
    
    
            k = i + 1;

            while (k < charsSize && chars[k] == c) {
    
    
                k++;
                count++;
            }

            chars[num++] = c;

           // printf("count=%d\n", count);

            if (count == 1) {
    
    

            }
            else {
    
    
                if (count <= 9) {
    
    
                    chars[num++] = count + '0';
                }
                else {
    
    
                    int x = 0;
                    int t[33];
                    while (count != 0) {
    
    
                        t[x++] = count % 10;
                        count /= 10;
                    }
                    for (int y = x-1; y>=0; y--) {
    
    
                        chars[num++] = t[y] + '0';
                    }


                }
            }


            i = k;


        }
        else {
    
    
            chars[num++] = c;
            i++;
        }

    }

    for (int z = 0; z < num; z++) {
    
    
        printf("%c ", chars[z]);
    }

    printf("\n");

    return num;

}

int main()
{
    
    

    char chars[13] = {
    
     'a','b','b','b','b','b','b','b','b','b','b','b','b' };

    compress(chars, 13);
    


    return 0;
}



调试

在调试代码的过程中碰到问题:
heap-buffer-overflow on address~~~
一般是数据上下溢出,最后发现是在统计字符个数的时候,写成了:
while ( chars[k] == c&&k<charsSize)
这样的话,k=charsSize,就会导致chars溢出了。
应该改成
while (k < charsSize && chars[k] == c)

记录下一个代码经验,有判断的时候,下标判断要写在前面。

写在最后的话

 写代码,真的只能一步一步的敲,日积月累~~ 希望自己的代码能力在一段时间之后,可以提高~~~~

猜你喜欢

转载自blog.csdn.net/weixin_43911199/article/details/127185241