java - 反向编码字符串
问题描述
我正在寻求有关如何反转我的代码的帮助,以便输入'A2B5C2'会给我输出'AABBBBBCC',有什么建议吗?
谢谢
public static void printRLE(String str) {
int n = str.length();
for (int i = 0; i < n; i++) {
// Count occurrences of current character
int count = 1;
while (i < n - 1 && str.charAt(i) == str.charAt(i + 1)) {
count++;
i++;
}
// Print character and its count
System.out.print(str.charAt(i));
System.out.print(count);
}
}
public static void main(String[] args) {
String str = "AABBBBBCC";
printRLE(str);
}
解决方案
为了得到这种情况,数字将超过 9,我建议使用一个简单的正则表达式来匹配letter+number
,然后将字母重复您需要的次数:
static String getRevRLE(String str) {
StringBuilder res = new StringBuilder();
Matcher m = Pattern.compile("([a-zA-Z][0-9]+)").matcher(str);
while (m.find()) {
String g = m.group();
res.append(g.substring(0, 1).repeat(Integer.parseInt(g.substring(1))));
}
return res.toString();
}
使用Streams
API,您可以减少到
static String getRevRLE(String str) {
return Pattern.compile("([a-zA-Z][0-9]+)").matcher(str).results()
.map(MatchResult::group)
.map(g -> g.substring(0, 1).repeat(Integer.parseInt(g.substring(1))))
.collect(Collectors.joining());
}
测试
public static void main(String[] args) {
String str = "AABBBBBCCCCCCCCCCCCCCCCCCCC";
String rle = getRLE(str);
String res = getRevRLE(rle);
System.out.println(res + " " + res.equals(str)); // AABBBBBCCCCCCCCCCCCCCCCCCCC true
}
推荐阅读
- javascript - 无法在 npm run build 上缩小代码
- docker - jupyter 内核在运行 nginx/1.13.12 网络服务器的 docker 容器中的 jupyter notebook 服务器上长时间运行期间重新启动
- r - 循环中的数据处理问题
- c# - 尝试使用 Dapper 为字符串赋值时请求退出无响应
- pdf - 将具有透明背景的 PDF 导入 Gimp
- javascript - 未销毁的 Angular DOM 元素
- javascript - 为什么条形图未与 y 轴对齐
- excel - Mac 上的 Excel:如何访问 DevTools 以获取对话框内容?
- c# - 在反序列化之前在客户端应用程序获取 .NET Remoting XML SOAP 消息
- python - Selenium 没有获取元素的文本