package com.yinhai.onehour; // 包路径不可修改!!!
import java.util.*; //只能使用最高1.8版本JDK提供的API
/**
* 题目:给定一个字符串(只包含小写英文字母),按顺序执行以下两条规则,输出计算后的字符串。
* <p>
* 规则 1:对于连续顺序4位及以上的字母,中间使用“~”替换。
* 例如:ahhhhhhbcdefko, 替换后为ahhhhhhb~fko。
* <p>
* 规则2:对于连续重复出现3个及以上的字母,以该字母+重复的个数替换。
* 例如:ahhhhhhbcdefko,替换后为ah6bcdefko。
* <p>
* 总体示例:
* 输入字符串为:ahhhhhhbcdefko 结果为:ah6b~fko
* 输入字符串为:ahhhhhhbcdefko 结果为:ah6b~fko
* 输入字符串为:ammmmmnopqko 结果为:am5~qko
* 输入字符串为:abcdefffffadfasdfa 结果为:a~f5adfasdfa
* 输入字符串为:mnopqqqrstabs 结果为:m~q3~tabs
* 输入字符串为:xyzabcd 结果为:xyza~d
* <p>
* 提示:
* 1. 规则按规则1,规则2顺序执行。先执行1,后执行2。
* 2. 请注意边界值的考虑,注意连续出现条件匹配的情况。
* 3. 请注意字符串拼接的性能消耗。
* 4. 请先花一定时间理清思路在再编写代码。
* 5. 可以试着把上面总体实例中的例子跑正确后再提交。
*/
public class Template { //类名不可修改!!!
/**
* 程序逻辑请在该方法中完成
* <p>
* 注意:
* 1. 方法名、参数个数及类型不可更改,只可修改函数体!!!
* 2. 提交文件时,保证包路径package com.yinhai.onehour
*
* @param inData 参数 验证程序通过该参数传入字符串
* @return 返回值 验证程序通过该返回值验证程序正确性
*/
public String methodTest(String inData) {
String outData = "";
outData+=rule1(inData);
outData=rule2(outData);
// outData = myMethod(inData); // 可添加自己的函数
return outData;
}
private String rule1(String inData) {
StringBuilder outData =new StringBuilder();
for (int i = 0; i < inData.length(); i++) {
int begin = i;
//起始字母
char begin_char = inData.charAt(begin);
//判断是否是最后一个字母 和 是否是连续4个字母
while (begin + 1 < inData.length() && inData.charAt(begin + 1) - begin_char == 1) {
begin_char = inData.charAt(begin + 1);
begin++;
}
//出现连续4个字符替换,否则不变
if (begin - i >= 3) {
outData.append(inData.charAt(i) + "~" + inData.charAt(begin));
i = begin;
} else {
outData.append(inData.charAt(i));
}
}
return outData.toString();
}
private String rule2(String inData) {
StringBuilder outData = new StringBuilder();
for (int i = 0; i < inData.length(); i++) {
int begin = i;
//起始字母
char begin_ch = inData.charAt(begin);
//判断是否是最后一个字母 和 连续3个字母是否相同
while (begin + 1 < inData.length() && inData.charAt(begin + 1) - begin_ch == 0) {
begin_ch = inData.charAt(begin + 1);
begin++;
}
//当连续3个字母相同时替换,否则不变
if (begin - i >= 2) {
outData.append(inData.charAt(i) + "" + (begin - i + 1)) ;
i = begin;
} else {
outData.append(inData.charAt(i));
}
}
return outData.toString();
}
/**
* 可修改,验证自己的答案
*
* @param args
*/
public static void main(String[] args) {
List<String> inDatas = new ArrayList<>();
inDatas.add("ahhhhhhbcdefko");
inDatas.add("ahhhhhhbcdefko");
inDatas.add("ammmmmnopqko");
inDatas.add("abcdefffffadfasdfa");
inDatas.add("mnopqqqrstabs");
inDatas.add("xyzabcd");
List<String> outDatas = new ArrayList<>();
outDatas.add("ah6b~fko");
outDatas.add("ah6b~fko");
outDatas.add("am5~qko");
outDatas.add("a~f5adfasdfa");
outDatas.add("m~q3~tabs");
outDatas.add("xyza~d");
// 用于自己校验结果
Template template = new Template();
long startTime = System.currentTimeMillis();
for (int i = 0;i < inDatas.size();i++) {
String result = template.methodTest(inDatas.get(i));
System.out.println(result.equals(outDatas.get(i)));
}
long endTime = System.currentTimeMillis();
System.out.println("耗时(毫秒):" + (endTime - startTime));
}
}
连续顺序替换 连续重复字母替换
最新推荐文章于 2023-03-14 06:51:33 发布