每天一道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
- 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
- 将字符串中连续相同的字符表达成字符加个数的形式输出
- 算法:字符串编码 (将连续的字符替换成“连续出现的个数+字符”)
- 给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”。比如字符串AAAABCCDAA会被编码成4A1B2C1D2A。
- 用SQL将连续相同的字符压缩成一个字符
- 统计字符串中相同字符的个数
- 每天一道LeetCode-----两个有序数组合并后的第K个数
- 输入一个字符串,将其各个字符对应的ASCII值加5后,输出结果。
- ACdream 计算最长非连续相同字符的个数
- 一道算法题---把字符串内连续相同字符删除
- 【原】完全删除字符串中连续相同的字符
- 最长的连续相同字符的字符串和最长连续不相同字符的子字符串问题
- 用递归找一个字符串中 最长连续出现的字符的个数
- 如何将两个有重复字符在内的字符串合并成一个,并且排序
- 判断两字符串相同不同的字符个数
- 查找字符串中相同的最大字符和个数
- 递归算法计算一个字符串中最大的连续字符个数
- 用递归算法计算一个字符串中最大的连续字符个数
- POJ 3667
- Vue基础
- 解决CentOS7下使用ifconfig命令无法查看inet地址
- Android Studio 打包 release 版本后无法安装的问题
- 使用canvas与png/svg等格式图片解决html异形按钮创建
- 每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
- 1.身份证号码校验
- 先码后看 java多线程图解 侵立删
- SourceTree windows版本免注册免登陆使用方法
- machine-lenrning 机器学习概述
- Python数据挖掘建模 chapter_4 相关性分析
- 凸区域上的中值定理
- scanf() 的一些新姿势
- GreenDao3.2.2详细用法包括集成,运用