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;
    }
    }

题考察的知识点是数组操作和双指针技巧。

算法思路如下:

  1. 初始化两个变量 writeIndex 和 count,其中 writeIndex 表示写入位置,count 表示当前连续字符的计数。
  2. 从第二个字符开始遍历输入字符数组 chars:比较当前字符 chars[i] 和前一个字符 chars[i-1] 是否相等:如果不相等,说明当前连续字符的序列已经结束,需要将前一个字符及其计数写入 chars 数组中。然后更新 writeIndex 的值,使其指向下一个待写入位置,并重置 count 为 1。如果相等,说明当前字符仍属于上一个字符的连续序列,增加计数值 count。
  3. 处理最后一个字符及其计数,将其写入 chars 数组中。
  4. 返回 writeIndex 的值,即为压缩后数组的长度,然后使用res赋值,返回res数组。

通过双指针技巧,我们可以在原地修改字符数组,减少额外空间的使用。

全部评论

相关推荐

听说改名字就能收到offer哈:Radis写错了兄弟
点赞 评论 收藏
分享
牛客717484937号:双飞硕没实习挺要命的
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务