每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数

来源:互联网 发布:淘宝上差评多久消失 编辑:程序博客网 时间:2024/06/06 20:00

Count and Say

原题链接 Count and Say
这里写图片描述
求出第n个表达式,第n个表达式由第n-1个表达式的读音构成。如

  • 第3个表达式为21,读作1个2,1个1,所以第4个表达式就是1211。
  • 第4个表达式读作1个1,1个2,2个1,所以第5个表达式为111221。

话说以前有次考试给的就是这一堆字符串,没给说明,问下一个是什么,当时的想法:这都是什么鬼?


因为第n个表达式需要第n-1个表达式,所以只能从第一个开始求了,然后每次计算读音,构成新的表达式,再求下一个表达式…

class Solution {public:    string countAndSay(int n) {        /* 第一个表达式是1 */        string res("1");        while(--n)        {            /* 下一个新的表达式 */            string tmp("");            /* 当前字符 */            char prev = res[0];            /* 记录当前字符出现了多少次 */            int cnt = 1;            for(int i = 1; i <= res.size(); ++i)            {                /* 带等号是为了添加最后一个字符,这样就不用写在for外面了 */                if(i < res.size() && res[i] == prev)                {                    ++cnt;                }                else                {                    /*                      * 不能写成tmp += static_cast<char>(cnt + '0') + prev;                     * 比如cnt + '0' + '1'不是一个数字字符了                     */                    tmp += static_cast<char>(cnt + '0');                    tmp += prev;                    if(i < res.size())                    {                        prev = res[i];                        cnt = 1;                    }                }            }            /* 移动语义,防止拷贝 */            res = std::move(tmp);        }        return res;    }};

String Compression

原题链接String Compression
这里写图片描述
给一个字符数组,把连续一样的合并,后面增加个数。如果只有1个可以不加个数,图片例子比较直观。
要求就是在原字符数组上做更改,不能有额外的内存使用
代码如下

class Solution {public:    int compress(vector<char>& chars) {        if(chars.empty())            return 0;        int res = 0;        /* 记录当前字符出现的个数,初始为1,第一个字符出现一次 */        int cnt = 1;        int prev_idx = 0;        /* 初始字符,第一个字符 */        char prev = chars[0];           /* 从第二个字符开始,等号是为了解决最后一个字符,不需要写在for外面 */        for(int i = 1; i <= chars.size(); ++i)        {            if(i < chars.size() && chars[i] == prev)            {                ++cnt;            }            else            {                ++res;                chars[prev_idx++] = prev;                /* 如果不为1,就需要将出现个数添加到后面 */                if(cnt != 1)                {                    int tmp_cnt = cnt;                    /* 计算个数有几位 */                    int bits = 1;                    while(cnt / 10)                    {                        ++bits;                        cnt /= 10;                    }                    cnt = tmp_cnt;                    /* 把个数转成字符添加到字符后面 */                    for(int idx = prev_idx + bits - 1; idx >= prev_idx; --idx)                    {                        chars[idx] = static_cast<char>(cnt % 10 + '0');                        cnt /= 10;                    }                    res += bits;                    prev_idx += bits;                }                if(i < chars.size())                {                    cnt = 1;                    prev = chars[i];                }            }        }        return res;    }};
阅读全文
0 0
原创粉丝点击