Leetcode443. 压缩字符串
题目:
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。
数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。
示例 1:
输入:
["a","a","b","b","c","c","c"]
输出:
返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
说明:
"aa"被"a2"替代。"bb"被"b2"替代。"ccc"被"c3"替代。
示例2:
输入:
["a","b","b","b","b","b","b","b","b","b","b","b","b"]
输出:
返回4,输入数组的前4个字符应该是:["a","b","1","2"]。
说明:
由于字符"a"不重复,所以不会被压缩。"bbbbbbbbbbbb"被“b12”替代。
注意每个数字在数组中都有它自己的位置。
题解:
1.设置左指针为0,返回的新长度size为0;
2.一步一步移动右指针,当右指针指向的位置的值不等于左指针指向的位置的值,或者右指针的值等于数组长度时,将左指针的值赋值给当前长度size的值,再将size值增加1;
3.如果右指针-左指针大于1时,计算右指针减去左指针的值,然后将值以字符的形式遍历存入数组size所在的位置中,再每次遍历之后将size值增加1;
4.最后将右指针的值赋值给左指针。
java代码:
public static int compress(char[] chars) {
int left = 0;
int size = 0;
for (int right = 0; right <= chars.length; right++) {
if (right == chars.length || chars[left] != chars[right]) {
chars[size] = chars[left];
size++;
if (right - left > 1) {
String k = (right - left) + "";
for (char i : k.toCharArray()) {
chars[size] = i;
size++;
}
}
left = right;
}
}
return size;
}
scala代码:
/**
* 输入:
* ["a","a","b","b","c","c","c"]
* 输出:
* 返回6,输入数组的前6个字符应该是:["a","2","b","2","c","3"]
*
* @param chars
* @return
*/
def compress(chars: Array[Char]): Int = {
var left = 0
var size = 0
for (right <- 0 to chars.length) {
if (right == chars.length || chars(left) != chars(right)) {
chars(size) = chars(left)
size = size + 1
if (right - left > 1) {
//循环遍历的原因是可能right-left>10,这样数组中要存多个值
val s = ((right - left) + "").toCharArray
for (c <- s) {
chars(size) = c
size = size + 1
}
}
left = right
}
}
size
}
LeetCode 443 压缩字符串算法解析
本文详细介绍了LeetCode第443题“压缩字符串”的算法解决方案,通过原地算法实现字符数组的压缩,降低存储空间需求。文章提供了Java和Scala两种语言的代码实现,并附带示例帮助理解。
995

被折叠的 条评论
为什么被折叠?



