一、題目
題目:給定一個字符串(只包含小寫英文字母),按順序執行以下兩條規則,輸出計算後的字符串。
規則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();
}
}
}