zoukankan      html  css  js  c++  java
  • (Good topic)压缩字符串 (3.16 leetcode每日打卡)

    字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
     示例1:
     输入:"aabcccccaaa"
     输出:"a2b1c5a3"

     示例2:
     输入:"abbccd"
     输出:"abbccd"
     解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。

    提示:
    字符串长度在[0, 50000]范围内。
     
    思路就是:遍历字符串,然后用cnt计数,然后写入另一个定义的字符串,最后比较长短即可
    做这道题对我来是真的忐忑,做了两个小时,分享一下我遇到的大坑
    1.首先int型转化为char型 需要整型+48然后强制类型转换
    2.然后运行不对,原因就是没有初始化定义的压缩数组,于是全部初始为'0',要养成初始化数组的好习惯
    3.结果仍然不对,上编译器调试,于是发现字符串末尾需要用''截断,不然会出现乱码
    4.然后个数小于十的通过了,依然不对,原因就是因为还有个数是多位数的,数字的长度不仅仅是小于10,想了好久该怎样把大于十的整型放入字符串,于是我用了itoa函数,没想到出现编译错误,上网上查了一下是因为itoa是window特有的,于是改为了sprintf函数
    5.我想这下总该对了,错误,原因就是压缩后的字符串可能比50000还长,这个是一开始没有想到的,于是改成了500000
     
    代码:
     1 char* compressString(char* S)
     2 {
     3     int i, len;
     4     int cnt = 1;
     5     int j = -1;
     6         char dealS[500000];
     7     memset(dealS, '0', 500000);
     8 
     9     char ch = S[0];
    10     for (i = 0; S[i]; i++);  //测量长度 其实可以用strlen
    11     len = i;
    12     if (len == 1)
    13     return S;
    14     for (i = 1; i < len+1; i++)  //len+1是为了防止还没等压缩就因为到了末尾而跳出遍历了了
    15     {
    16         if (ch == S[i])
    17         {
    18             cnt++;
    19         }
    20         else
    21         {
    22             dealS[++j] = ch;
    23             if (cnt < 10) //判断计数器大于还是小于0
    24             {
    25                 dealS[++j] = (char)(cnt + 48);
    26             }
    27             else
    28             {
    29                 char buffer[25];
    30                 sprintf(buffer, "%d", cnt);
    31                 for (int k = 0; buffer[k]; k++)
    32                 {
    33                     dealS[++j] = buffer[k];
    34                 }
    35             }
    36 
    37             ch = S[i];
    38             i--;
    39             cnt = 0;
    40         }
    41     }
    42 
    43     dealS[++j] = '';
    44     return strlen(dealS) < strlen(S) ? dealS : S;
    45 }
     
     
     
     
  • 相关阅读:
    树莓派入门之装系统
    git服务器的建立——Git折腾小记
    sk_buff的数据预留和对齐
    Linux 内核网络协议栈 ------sk_buff 结构体 以及 完全解释 (2.6.16)
    Linux网络之设备接口层:发送数据包流程dev_queue_xmit
    打印mac地址
    查看Linux进程CPU过高具体的线程堆栈(不中断程序)
    linux 终端报错 Out of memory: Kill process[PID] [process name] score问题分析
    记linux下rm误删bin文件的解决方式
    服务器有新消息主动推送给客户端浏览器
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/12502660.html
Copyright © 2011-2022 走看看