题解 | #压缩牛群编号#

压缩牛群编号

https://www.nowcoder.com/practice/db9dd240e5f54b6d8eeadfbd9b7f865f

  1. 题目考察的知识点

字符串

  1. 题目解答方法的文字分析

使用指针 write 指向「答案待插入的位置」,然后遍历数组,统计数组中相同字母的个数,分为字符数大于1和等于1两种情况处理。i 指针一直往后处理,每次找到字符相同的连续一段 [i,p)令长度为count,检查长度count是否大于 1。如果大于 1需要将数字拆分存储。因此需要使用 left 和 write 记录下存储数字的部分,再处理完 count 后,将 [start,write)部分进行翻转。并将i置为p--.

  1. 本题解析所用的编程语言

java

  1. 完整且正确的编程代码
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--;
        }
    }
}
全部评论

相关推荐

11-27 17:35
已编辑
蚌埠坦克学院 C++
深信服 后台开发 n×12
点赞 评论 收藏
分享
喜欢走神的孤勇者练习时长两年半:爱华,信华,等华,黑华
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务