题解 | #压缩牛群编号#
压缩牛群编号
https://www.nowcoder.com/practice/db9dd240e5f54b6d8eeadfbd9b7f865f
- 题目考察的知识点
字符串
- 题目解答方法的文字分析
使用指针 write 指向「答案待插入的位置」,然后遍历数组,统计数组中相同字母的个数,分为字符数大于1和等于1两种情况处理。i 指针一直往后处理,每次找到字符相同的连续一段 [i,p)令长度为count,检查长度count是否大于 1。如果大于 1需要将数字拆分存储。因此需要使用 left 和 write 记录下存储数字的部分,再处理完 count 后,将 [start,write)部分进行翻转。并将i置为p--.
- 本题解析所用的编程语言
java
- 完整且正确的编程代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param chars char字符型一维数组
* @return char字符型一维数组
*/
public char[] compress (char[] chars) {
//少于两个字符直接返回原数组
if(chars.length<=1){
return chars;
}
//write负责将字母和对应的数字写入到chars数组中
int write = 0;
//遍历数组,统计数组中相同字母的个数,以及分为字符数大于1和等于1两种情况处理
for (int i = 0; i < chars.length; i++) {
int p = i;
//记录相同的字符所占的区域
while (p < chars.length && chars[i] == chars[p])p++;
//将字符写入chars数组
chars[write++] = chars[i];
//统计字符个数并将其写入chars数组
int count = p-i;
if (count > 1) {
int left = write;
while(count>0){
chars[write++]=(char)((count % 10) + '0');
count/=10;
}
reverse(chars,left,write-1);
}
i = --p;
}
return Arrays.copyOf(chars,write);
}
//反转数组指定区域的数字
public void reverse(char[] a, int left, int right) {
while (left < right) {
char temp = a[left];
a[left] = a[right];
a[right] = temp;
left++;
right--;
}
}
}