问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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)的更多相关文章

  1. C#LeetCode刷题之#205-同构字符串(Isomorphic Strings)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3770 访问. 给定两个字符串 s 和 t,判断它们是否是同构的. ...

  2. C#LeetCode刷题之#859-亲密字符串​​​​​​​​​​​​​​(Buddy Strings)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3973 访问. 给定两个由小写字母构成的字符串 A 和 B ,只要 ...

  3. C#LeetCode刷题之#557-反转字符串中的单词 III(Reverse Words in a String III)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3955 访问. 给定一个字符串,你需要反转字符串中每个单词的字符顺 ...

  4. C#LeetCode刷题之#345-反转字符串中的元音字母​​​​​​​(Reverse Vowels of a String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3935 访问. 编写一个函数,以字符串作为输入,反转该字符串中的元 ...

  5. C#LeetCode刷题之#344-反转字符串​​​​​​​(Reverse String)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3933 访问. 编写一个函数,其作用是将输入的字符串反转过来. 输 ...

  6. C#LeetCode刷题之#541-反转字符串 II(Reverse String II)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3951 访问. 给定一个字符串和一个整数 k,你需要对从字符串开头 ...

  7. [Swift]LeetCode443. 压缩字符串 | String Compression

    Given an array of characters, compress it in-place. The length after compression must always be smal ...

  8. C#LeetCode刷题-字符串

    字符串篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.6% 中等 5 最长回文子串   22.4% 中等 6 Z字形变换   35.8% 中等 8 字符串转整数 (atoi)   ...

  9. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串   24.5% 中等 11 盛最多水的容器   43.5% 中等 15 三数之和   16.1% 中等 16 最接近的三数之和   3 ...

随机推荐

  1. 在 vue 中使用 WebSocket

    <template> <div class="hello"> <h1>{{ msg }}</h1> <h1>{{ res ...

  2. java opencsv解析csv文件

    记一次使用opencsv解析csv文件时碰到的坑 最近在开发过程中需要解析csv文件,公司用的解析工具是opencsv,在根据opencsv的官方文档去解析时发现csv文件中含有繁体字,使用其自带的C ...

  3. 字符串学习总结(Hash & Manacher & KMP)

    前言 终于开始学习新的东西了,总结一下字符串的一些知识. NO.1 字符串哈希(Hash) 定义 即将一个字符串转化成一个整数,并保证字符串不同,得到的哈希值不同,这样就可以用来判断一个该字串是否重复 ...

  4. .net core 使用 Serilog 作为日志提供者

    nuget引入 Serilog.AspNetCore Startup构造函数: public Startup(IConfiguration configuration) { Configuration ...

  5. justoj connect(边的处理)

    CONNECT https://oj.ismdeep.com/contest/problem?id=1702&pid=2 Problem Description 有nn个顶点,每个顶点有自己的 ...

  6. Java环境变量设置:Path、CLASSPATH、JAVA_HOME的作用分别是什么?

    1.Path 作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找百看是否能找到相应的命令程序.        需要把jdk安装目录下的b ...

  7. sed 指定行范围匹配

    sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...

  8. 《Python Web开发实战》|百度网盘免费下载|Python Web开发

    <Python Web开发实战>|百度网盘免费下载|Python Web开发 提取码:rnz4 内容简介 这本书涵盖了Web开发的方方面面,可以分为如下部分: 1. 使用最新的Flask ...

  9. Python os.getcwdu() 方法

    概述 os.getcwdu() 方法用于返回一个当前工作目录的Unicode对象.高佣联盟 www.cgewang.com Unix, Windows 系统下可用. 语法 getcwdu()方法语法格 ...

  10. PHP date_sun_info() 函数

    ------------恢复内容开始------------ 实例 返回有关 2013 年 1 月 1 日,纬度 31.7667,经度 35.2333 的日出/日落和黄昏开始/黄昏结束的信息: < ...