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数组。
通过双指针技巧,我们可以在原地修改字符数组,减少额外空间的使用。