Java 题解 | #压缩牛群编号#
压缩牛群编号
https://www.nowcoder.com/practice/db9dd240e5f54b6d8eeadfbd9b7f865f
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param chars char字符型一维数组
* @return char字符型一维数组
*/
public char[] compress (char[] chars) {
// write code here
int writeIndex = 0;
int count = 1;
for (int i = 1; i < chars.length; i++) {
if (chars[i] != chars[i - 1]) {
// 写入前一个字符及其计数
chars[writeIndex++] = chars[i - 1];
if (count > 1) {
// 将计数值转换成字符并写入
for (char c : String.valueOf(count).toCharArray()) {
chars[writeIndex++] = c;
}
}
count = 1;
} else {
count++;
}
}
// 处理最后一个字符及其计数
chars[writeIndex++] = chars[chars.length - 1];
if (count > 1) {
for (char c : String.valueOf(count).toCharArray()) {
chars[writeIndex++] = c;
}
}
char[] res = new char[writeIndex];
for(int i = 0;i<writeIndex;i++){
res[i] = chars[i];
}
return res;
}
}
题考察的知识点是数组操作和双指针技巧。
算法思路如下:
- 初始化两个变量
writeIndex和count,其中writeIndex表示写入位置,count表示当前连续字符的计数。 - 从第二个字符开始遍历输入字符数组
chars:比较当前字符 chars[i] 和前一个字符 chars[i-1] 是否相等:如果不相等,说明当前连续字符的序列已经结束,需要将前一个字符及其计数写入 chars 数组中。然后更新 writeIndex 的值,使其指向下一个待写入位置,并重置 count 为 1。如果相等,说明当前字符仍属于上一个字符的连续序列,增加计数值 count。 - 处理最后一个字符及其计数,将其写入
chars数组中。 - 返回
writeIndex的值,即为压缩后数组的长度,然后使用res赋值,返回res数组。
通过双指针技巧,我们可以在原地修改字符数组,减少额外空间的使用。

