[字符串原地压缩][代码实现]

本文详细阐述了如何实现字符串的原地压缩,包括解决字符重复计数、处理特殊情况及长度超过9的字符处理方法,并提供了Java代码实现。

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

题目

字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2",请编程实现。

 

思想

 

首先想到最简单的方法是创建一个数组,一次遍历就可以将原字符串压缩。时间复杂度O(N),空间复杂度ON)。但这种方法不符合题意,题目要求原地压缩。那么空间复杂度应该是O1)。

 

如果使用原地压缩,最麻烦的就是移动数据。如果不用移动数据,就能达到时间复杂度ON),空间复杂度为O1)。

 

不移动数据,可以增加一个标记。标记压缩后的字符串的长度。这样就可以一个数组两个用途了。

 

问题

如下的字符串“abcccc”,压缩后a1b1c4。另外字符串“abc”压缩后成了“a1b1c1”。这两种情况下,上述方法就不好用了。尤其第二种情况下,压缩后的数组比压缩前还长。 对于这两种情况,因为题目没有规定长度为1的情况的处理情况,不如咱们假设如果长度为1的字符,后面不用1。这样就简化了问题。

 

另外,还有一个问题,就是在其中一个字符长度大于9时的处理方法。如果长度大于9,需要获取到长度位数,然后将长度数字copyString上。下面实现的代码没有考虑这种情况。

 

 

代码

 

/**
 * 原地压缩
 * 字符串原地压缩。题目描述:“eeeeeaaaff" 压缩为 "e5a3f2",请编程实现。
 * @author ajwang
 *
 */
public class PlaceCompress {
	
	public static void main(String[] args) {
		char[] string = "aabbccddeeffg".toCharArray();
		int end = placeCompress(string);
		System.out.println(String.copyValueOf(string,0,end+1));
	}
	public  static int placeCompress(char[] string) {
		int length = string .length;
		int compressLength = 0;
		int count = 1;
		for(int i=1;i<length;i++) {
			if(string[i]==string[compressLength]) {
				count++;
			} else {
				if(count!=1) {
					compressLength++;
					string[compressLength]=(char) ('0'+count%10);
					
				} 
				compressLength++;
				string[compressLength]= string[i];
				count = 1;
			}
			//当处理结束时,需要计算一下最后一个字符出现的次数
			if(i==length-1) {
				if(count!=1) {
					compressLength++;
					string[compressLength]=(char) ('0'+count);
				}
				
			}
			
			
		}
		return compressLength;
	}
}
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值