C#LeetCode刷题之#443-压缩字符串(String Compression)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3943 访问。
给定一组字符,使用原地算法将其压缩。
压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。
在完成原地修改输入数组后,返回数组的新长度。
进阶:你能否仅使用O(1) 空间解决问题?
输入:['a','a','b','b','c','c','c']
输出:返回6,输入数组的前6个字符应该是:['a','2','b','2','c','3']
说明:"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
输入:['a']
输出:返回1,输入数组的前1个字符应该是:['a']
说明:没有任何字符串被替代。
输入:['a','b','b','b','b','b','b','b','b','b','b','b','b']
输出:返回4,输入数组的前4个字符应该是:['a','b','1','2']。
说明:由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。注意每个数字在数组中都有它自己的位置。
注意:
- 所有字符都有一个ASCII值在[35, 126]区间内。
- 1 <= len(chars) <= 1000。
Given an array of characters, compress it in-place.
The length after compression must always be smaller than or equal to the original array.
Every element of the array should be a character (not int) of length 1.
After you are done modifying the input array in-place, return the new length of the array.
Follow up:Could you solve it using only O(1) extra space?
Input:['a','a','b','b','c','c','c']
Output:Return 6, and the first 6 characters of the input array should be: ['a','2','b','2','c','3']
Explanation:"aa" is replaced by "a2". "bb" is replaced by "b2". "ccc" is replaced by "c3".
Input:['a']
Output:Return 1, and the first 1 characters of the input array should be: ['a']
Explanation:Nothing is replaced.
Input:['a','b','b','b','b','b','b','b','b','b','b','b','b']
Output:Return 4, and the first 4 characters of the input array should be: ['a','b','1','2'].
Explanation:Since the character "a" does not repeat, it is not compressed. "bbbbbbbbbbbb" is replaced by "b12".Notice each digit has it's own entry in the array.
Note:
- All characters have an ASCII value in [35, 126].
- 1 <= len(chars) <= 1000.
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3943 访问。
public class Program {
public static void Main(string[] args) {
var chars = new char[] { 'a', 'b', 'b' };
var res = Compress(chars);
Console.WriteLine(res);
chars = new char[] { 'a', 'a', 'b', 'b', 'c', 'c', 'c' };
res = Compress2(chars);
Console.WriteLine(res);
Console.ReadKey();
}
private static int Compress(char[] chars) {
if(chars.Length == 1) return 1;
var count = 1;
var res = string.Empty;
for(var i = 1; i < chars.Length; i++) {
if(chars[i] == chars[i - 1]) {
count++;
} else {
res += chars[i - 1].ToString() + (count == 1 ? "" : count.ToString());
count = 1;
}
if(i == chars.Length - 1) res +=
chars[i].ToString() + (count == 1 ? "" : count.ToString());
}
for(int i = 0; i < res.Length; i++) {
chars[i] = res[i];
}
return res.Length;
}
private static int Compress2(char[] chars) {
if(chars.Length == 1) return 1;
var index = 0;
var count = 1;
for(var i = 1; i < chars.Length; i++) {
if(chars[i] == chars[i - 1]) {
count++;
} else {
ResetChars(chars, ref count, ref index, i - 1);
}
if(i == chars.Length - 1) {
ResetChars(chars, ref count, ref index, i);
}
}
return index;
}
private static void ResetChars(char[] chars, ref int count, ref int index, int i) {
if(count != 1) {
chars[index] = chars[i];
for(int j = 0; j < count.ToString().Length; j++) {
chars[j + index + 1] = count.ToString()[j];
}
index += count.ToString().Length + 1;
} else {
chars[index] = chars[i];
index++;
}
count = 1;
}
}
以上给出2种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3943 访问。
3
6
分析:
显而易见,以上2种算法的时间复杂度均为: 。请注意 Compress2 的时间复杂度不是
,因为数组只被扫描了一遍。
C#LeetCode刷题之#443-压缩字符串(String Compression)的更多相关文章
- C#LeetCode刷题之#205-同构字符串(Isomorphic Strings)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3770 访问. 给定两个字符串 s 和 t,判断它们是否是同构的. ...
- C#LeetCode刷题之#859-亲密字符串(Buddy Strings)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3973 访问. 给定两个由小写字母构成的字符串 A 和 B ,只要 ...
- C#LeetCode刷题之#557-反转字符串中的单词 III(Reverse Words in a String III)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3955 访问. 给定一个字符串,你需要反转字符串中每个单词的字符顺 ...
- C#LeetCode刷题之#345-反转字符串中的元音字母(Reverse Vowels of a String)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3935 访问. 编写一个函数,以字符串作为输入,反转该字符串中的元 ...
- C#LeetCode刷题之#344-反转字符串(Reverse String)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3933 访问. 编写一个函数,其作用是将输入的字符串反转过来. 输 ...
- C#LeetCode刷题之#541-反转字符串 II(Reverse String II)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3951 访问. 给定一个字符串和一个整数 k,你需要对从字符串开头 ...
- [Swift]LeetCode443. 压缩字符串 | String Compression
Given an array of characters, compress it in-place. The length after compression must always be smal ...
- C#LeetCode刷题-字符串
字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.6% 中等 5 最长回文子串 22.4% 中等 6 Z字形变换 35.8% 中等 8 字符串转整数 (atoi) ...
- C#LeetCode刷题-双指针
双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.5% 中等 11 盛最多水的容器 43.5% 中等 15 三数之和 16.1% 中等 16 最接近的三数之和 3 ...
随机推荐
- 没内鬼,来点干货!SQL优化和诊断
SQL优化与诊断 Explain诊断 Explain各参数的含义如下: 列名 说明 id 执行编号,标识select所属的行.如果在语句中没有子查询或关联查询,只有唯一的select,每行都将显示1. ...
- Ethical Hacking - NETWORK PENETRATION TESTING(8)
WEP Cracking Basic case Run airdump-ng to log all traffic from the target network. airodump-ng --cha ...
- P1092 虫食算(洛谷)
今天做了一道题,我之前吹牛的时候曾经说:“这个题我觉得深搜剪枝一下就可以了.”. 我觉得我之前说的没错“这个题深搜剪枝亿下,再加点玄学就可以了!” 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子 ...
- Linux 后台启动 Redis
1. 修改 redis.conf 首先,这里有一个坑 ! 不同的 redis版本,在安装的时候,redis.conf 的路径稍微有些不同 redis.conf 可能出现的三个位置: /etc/redi ...
- apache 添加多个站点
虚拟主机 (Virtual Host) 是在同一台机器搭建属于不同域名或者基于不同 IP 的多个网站服务的技术.可以为运行在同一物理机器上的各个网站指配不同的 IP 和端口,也可让多个网站拥有不同的域 ...
- 利用python实现平稳时间序列的建模方式
一.平稳序列建模步骤 假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏 ...
- DQL_MySQL
4.DQL(查询数据){SUPER 重点} 4.1DQL (Data Query Language : 数据查询语言) -所有的查询操作: Select 数据库中最核心的语言 create data ...
- vj map
/* * 换行好烦人呀! */ #include <iostream> #include <map> #include <string> using namespa ...
- Webpack 原理浅析
作者: 凹凸曼 - 风魔小次郎 背景 Webpack 迭代到4.x版本后,其源码已经十分庞大,对各种开发场景进行了高度抽象,阅读成本也愈发昂贵.但是为了了解其内部的工作原理,让我们尝试从一个最简单的 ...
- PHP NULL 合并运算符
HP 7 新增加的 NULL 合并运算符(??)是用于执行isset()检测的三元运算的快捷方式. NULL 合并运算符会判断变量是否存在且值不为NULL,如果是,它就会返回自身的值,否则返回它的第二 ...