使用游长编码对字符串压缩 Run Length编码示例
发布时间:2022-02-18 06:58:51
标签:字符串压缩,游长,编码
例:Helloooooo => He2l6o
/**
* Run-Length编码(游长编码)
* @author will
*
*/
public class RunLengthEncoder {
public static void main(String[] args) {
String input = "0";
System.out.println("Original String Length: " + input.length());
String encodedStr = encode(input);
System.out.println("Encoded String: " + encodedStr);
System.out.println("Encoded String Length: " + encodedStr.length());
String decodedStr = decode(encodedStr);
System.out.println("Decoded String: " + decodedStr);
}
/**
* 用Run-Length算法编码字符串
* @param sourceStr 原始字符串
* @return
*/
public static String encode(String sourceStr) {
if(sourceStr == null || sourceStr.length() <= 1) {
return sourceStr;
}
int len = sourceStr.length();
StringBuilder resultBuilder = new StringBuilder();
for(int i = 0; i < len; i++) {
char cur = sourceStr.charAt(i);
int runLength = 1;
while((i+1) < len && sourceStr.charAt(i+1) == cur) {
i++;
runLength++;
}
if(runLength > 1) {
resultBuilder.append(runLength + "" + cur);
}
else {
resultBuilder.append(cur);
}
}
return resultBuilder.toString();
}
/**
* 解码Run-Length编码的字符串
* @param encodedStr
* @return
*/
public static String decode(String encodedStr) {
if(encodedStr == null || encodedStr.length() <= 1) {
return encodedStr;
}
int len = encodedStr.length();
StringBuilder resultBuilder = new StringBuilder();
for(int i = 0; i < len; i++) {
char curChar = encodedStr.charAt(i);
if(Character.isDigit(curChar)) {
i++;
char nextChar = encodedStr.charAt(i);
int runLength = Integer.parseInt(curChar + "");
for(int j = 0; j < runLength; j++) {
resultBuilder.append(nextChar);
}
}
else {
resultBuilder.append(curChar);
}
}
return resultBuilder.toString();
}
}
0
投稿
猜你喜欢
- 一、Shader基础知识1.1、什么是Shader在讲什么是Shader之前我们先看看下面两段代码 这两段代码实现的功能都是提取
- 方式一:在gradle.properties中写入:#测试环境ENV_TEST=test#开发环境ENV_DEV=dev#生产环境ENV_O
- 混合事务在ORM框架的事务管理器的事务内,使用JdbcTemplate执行SQL是不会纳入事务管理的。下面进行源码分析,看为什么必须要在Da
- 前言:阻塞或唤醒一个Java线程需要操作系统切换CPU状态来完成,这种状态转换需要耗费处理器时间。如果同步代码块中的内容过于简单,状态转换消
- 前言本文详细介绍如何使用spring-boot2.x快速整合log4j2日志框架。spring-boot2.x使用logback作为默认日志
- 一、什么是网关限流:在微服务架构中,网关层可以屏蔽外部服务直接对内部服务进行调用,对内部服务起到隔离保护的作用,网关限流,顾名思义,就是通过
- 题目要求思路:模拟解题的核心思想在于逆向思维,不考虑每个子数组中的唯一字符个数,转而考虑每个字符可以作为多少个子数组的唯一字符;所以在计算答
- 本文实例讲述了C#使用Ado.net读取Excel表的方法。分享给大家供大家参考。具体分析如下:微软NET提供了一个交互的方法,通过使用AD
- 今天有同事用swagger2开发时,有一方法返回Map<String,List<Object>>出现无法解析错误。P
- 基于 kotlin/coroutine/retrofit/jetpack 打造,100来行代码,用法超级简单舒适设置默认Retrofit工厂
- 一、简介Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为
- 无论您是为具有单个处理器的计算机还是为具有多个处理器的计算机进行开发,您都希望应用程序为用户提供最好的响应性能,即使应用程序当前正在完成其他
- 我在以前的博客中介绍了如何使用XmlDocument类对XML进行操作,以及如何使用LINQ to XML对XML进行操作。它们分别使用了X
- 在使用Java web开发的后端工程师们大多会使用Maven作为项目构建以及编译的工具,微服务和大中台当道的今天,更加关注maven的细节是
- 需求基于MTK8163 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加思路需求开始做之前,一定要研读SystemUI Navig
- * 的实现使用的模式:代理模式。代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问。类似租房的中介。两种 * :(1)jd
- C# SynchronizationContext及Send和Post使用1、(SynchronizationContext)同步上下文的作
- 正文:相关术语翻译说明:Mark,标记;Sweep,清除;Compact,整理; 也有人翻译为压缩,译者认为GC时不存在压缩这回事。Copy
- 提到数组大家肯定不会陌生,但我们也知道数组有个缺点就是在创建时就确定了长度,之后就不能更改长度。所以Java官方向我们提供了ArrayLis
- 用注解实现Mybatis插入数据返回自增的主键Id我们在数据库表设计的时候,一般都会在表中设计一个自增的id作为表的主键。这个id也会关联到