挑戰1小時完成1道java編程題及答案

一、題目

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

	}

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章