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 ...
随机推荐
- Ant-Design-Vue中关于Form组件的使用
1.创建form表单的两种方式,不同的方式在js中创建表单的方式也不同 方式1:一般使用在搜索表单中,只需要双向绑定数据即可,那就使用这种方法即可 <template> <a-for ...
- 【测试工具】这些APP实用测试工具,不知道你就out了!
本期,我将给大家介绍14款实用的测试工具,希望能够帮到大家!(建议收藏) UI自动化测试工具 1. uiautomator2 Github地址:https://github.com/openatx/u ...
- smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法
smartJQueryZoom 是一个很好用的库. 它基于jQuery,可以对某个元素(比如 img)进行渲染,渲染之后可以放大这个区域,在做图片浏览时很好用. 但它有一个兼容性BUG: 当浏览器不是 ...
- vue-methods三种调用的形势
var btn = { template:`<button>组件add</button>` } var any = new Vue({ el: '#app', data:{ a ...
- Docker 入门教程(1)——安装
docker大名听说了很久,一直没有去研究过,但现在面试动不动要求docker,还是研究下吧.由于我的电脑是win10系统(穷,买不起mac),安装过程各种坑爹问题不断,一度都想放弃,所以说垃圾win ...
- Java基础(二)流程语句与数组
Java流程语句详解:https://www.cnblogs.com/jiajia-16/p/6008200.html Java数组详解:https://www.cnblogs.com/jiajia- ...
- MySQL组复制MGR(四)-- 单主模式与多主模式
(一)概述 组复制可以运行在单主模式下,也可以运行在多主模式下,默认为单主模式.组的不同成员不能部署在不同模式下,要切换模式,需要使用不同配置重新启动组而不是单个server. 相关参数如下: # 该 ...
- 多个activity的博客参考,用mainactivity 调用 明天阅读一下
https://blog.csdn.net/hbwxy521/article/details/53101019
- Usvn迁移
近期由于公司需要整理所有的服务器资源进行统一管理,因此需要迁移原usvn到新环境,但是在网上查找有关usvn的迁移信息没有结果,故整理自己的通过测试的迁移方案共享给大家 迁移列表 原服务器 软件 目标 ...
- SpringCloud Bus 动态刷新全局广播和定点通知
全局广播 前提: 先具备良好的 RabbitMQ 环境 1. 演示广播效果,增加复杂度,再以3355为模板再制做一个3366模块 <!--pom.xml--> <?xml versi ...