leetcode 443. String Compression(压缩字符串)

该文章介绍了一个Java方法,用于在给定的字符数组`chars`中压缩连续重复的字母,将连续出现的字母和其计数合并表示。算法使用了四个关键变量,跟踪当前字母、计数、写入位置和当前字母的索引,并直接在原数组上进行修改,返回压缩后有效长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(Medium)
在这里插入图片描述

字符串chars中有连续出现的字母,当有连续出现的字母时,统计它出现的次数,
压缩成 “字母 + 次数”的格式,
只出现一次的不需要写次数,只写字母。
出现10次以上的,数字要分开写,比如Example3中的12, 要写成"1" 和 “2”.
不能新开辟数组写,要在原数组上写结果,返回有效长度。

思路:

感觉这个就靠观察,

需要几个变量:
1.当前字母的下标,
2.它出现的次数,
     那么下次更新字母下标时直接用当前下标+次数。
3.当前字母,
4.写入位置的下标,
     因为要在原数组上覆盖,所以要记录写入的位置,每写入一个字符下标要向右移一格。

    public int compress(char[] chars) {
        int n = chars.length;
        if(n == 1) return 1;

        char cur = chars[0]; //当前字母
        int cnt = 1;  //当前字母出现的次数
        int curIdx = 0;  //写入idx,每写入一个字符向右移动一格
        int curCharIdx = 0;  //指向当前字母的idx,+cnt即可跳到下一字母

        for(int i = 1; i <= n; i++) {
            if(i < n && chars[i] == chars[i-1]) cnt ++;
            else {            
                chars[curIdx ++] = cur;  //写入当前字母
                
                //更新当前字母,写在这里是因为后面可能出现continue,保证能更新
                curCharIdx += cnt; //下标跳到下一字母
                if(curCharIdx < n) cur = chars[curCharIdx]; //当前字母更新

                //写入当前字母出现的次数,1不需要写
                if(cnt == 1) continue;              
                if(cnt < 10) chars[curIdx++] = (char)(cnt+'0');
                else {
                    for(char c : (""+cnt).toCharArray()) {
                        chars[curIdx++] = c;
                    }
                }
                
                //更新cnt
                cnt = 1; 
            }
        }
        return curIdx;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值