一、题目
题目:给定一个字符串(只包含小写英文字母),按顺序执行以下两条规则,输出计算后的字符串。
规则1:对于连续顺序4位及以上的字母,中间使用“~”替换。
例如:“ahhhhhhbcdefko”,替换后为ahhhhhhb~fko。
规则2:对于连续重复出现3个及以上的字母,以该字母+重复的个数替换。
例如:“ahhhhhhbcdefko”,替换后为ah6bcdefko。
总体示例:
输入字符串为:ahhhhhhbcdefko 结果为:ah6b~fko
输入字符串为:ammmmmnopqko 结果为:am5~qko
输入字符串为:abcdefffffadfasdfa 结果为:a~f5adfasdfa
输入字符串为:mnopqqqrstabs 结果为:m~q3~tabs
输入字符串为:xyzabcd 结果为:xyza~d
提示:
1. 规则按规则1,规则2顺序执行,先执行1,后执行2。
2. 请注意边界值的考虑,注意连续出现条件匹配的情况。
3. 请注意字符串拼接的性能消耗。
4. 请先花一定时间理清思路在再编写代码。
5. 可以试着把上面总体实例中的例子跑正确后再提交。
排名规则按以下顺序进行排名:
1、前提是运行结果正确
2、性能
3、提交时间
二、答案
import java.util.*; //只能使用最高1.8版本JDK提供的API
/**
*/
public class Template { //类名不可修改!!!
/**
* 程序逻辑请在该方法中完成
*
* 注意:
* 1. 方法名、参数个数及类型不可更改,只可修改函数体!!!
* 2. 提交文件时,保证包路径package
*
* @param inData 参数 验证程序通过该参数传入字符串
* @return 返回值 验证程序通过该返回值验证程序正确性
*/
public String methodTest(String inData){
//TODO 实现逻辑
String validate = rule1(inData, 4);
String outData = rule2(validate);
return outData;
}
/**
* 可修改,验证自己的答案
* @param args
*/
public static void main(String[] args){
// 用于自己校验结果
Template template = new Template();
long startTime = System.currentTimeMillis();
String result = template.methodTest("abcdssttt");
System.out.println(result);
long endTime = System.currentTimeMillis();
System.out.println("耗时(毫秒):" + (endTime - startTime));
}
@SuppressWarnings("all")
public static String rule1(String value, int length){
StringBuilder result = new StringBuilder();
int i = 0;
//计数器
int counter = 1;
StringBuilder temp = new StringBuilder();
for(; i < value.length() -1;) {
//当前ascii值
int currentAscii = Integer.valueOf(value.charAt(i));
//下一个ascii值
int nextAscii = Integer.valueOf(value.charAt(i + 1));
//计算两数之间差一位则为连续
if(nextAscii - currentAscii == 1){
temp.append(value.charAt(i));
//计数器++
counter++;
}else{
result.append(temp.toString());
result.append(value.charAt(i));
//重置
counter = 1;
temp = new StringBuilder();
}
//满足连续数字或者字母
if(counter >= length ) {
// todo: 将之前的替换
if (i + 2 < value.length()){
if(Integer.valueOf(value.charAt(i + 2)) - Integer.valueOf(value.charAt(i + 1)) != 1){
result.append(temp.toString().charAt(0)).append("~").append(value.charAt(i+1));
i++;
//重置
counter = 1;
temp = new StringBuilder();
}
}else {
result.append(temp.toString().charAt(0)).append("~");
i++;
//重置
counter = 1;
temp = new StringBuilder();
}
}
i++;
}
//
if (temp !=null && temp.toString().length() > 0){
result.append(temp);
}
return result.append(value.charAt(value.length()-1)).toString();
}
@SuppressWarnings("all")
private static String rule2(String orign){
if(null == orign || orign.length()==0){
return orign;
}
String des = "";
StringBuilder stringBuilder = new StringBuilder("");
char last = orign.charAt(0);
int count = 1;
for(int i=1;i<orign.length();i++){
if(last==orign.charAt(i)){
++count;
}else{
if (count == 2){
stringBuilder.append(last).append("").append(last);
}else {
stringBuilder.append(last).append("").append(count==1?"":count);
}
last = orign.charAt(i);
count = 1;
}
}
if (count == 2){
stringBuilder.append(last).append(last);
return stringBuilder.toString();
}else {
stringBuilder.append(last).append(count==1?"":count);
return stringBuilder.toString();
}
}
}