順風2018秋招筆試題
阿新 • • 發佈:2018-12-10
對稱主義者小A定義了一種“雙節棍字串”:形式如同aa…bb…cc…,其中字元a的個數等於字元c的個數, 字元b的個數小於他們的個數。例如aaabccc,AACMM。給你一個字串,輸出該字串的最長雙節棍子串, 若沒有則輸出NULL,若有多個則輸出最靠前的一個。輸入字串的最長有1000000個字元。
public class Sontest { public static String getString(String str) { /* 思路: 1.將字串轉換為字元陣列,方便讀取判斷當中的內容 2.在迴圈中找內容,如果和上一個相同則計數count+1,如果是計數最大值(說明數量最多),則賦值給maxNun儲存,並且將該字元在字串中的index(第一次出現的位置)儲存; 3.如果i+1 != i,則進行count初始化1,然後繼續上述操作 4.最後在對i=length-1時,i與i-1的情況進行判斷 */ //用來計相同字元的個數 int count = 1; //用來儲存最大字元個數 int maxNum = 0; //獲取字元陣列的長度 int length = str.length(); //將字串轉換為字元陣列,用於字元比較 char[] arr = str.toCharArray(); //用來儲存擷取的字串 String newStr = ""; if (str.length() == 0) { System.out.println("NULL"); } else if (str.length() < 1000000) { //用來記錄當前字元的位置 int index = 0; for (int i = 0; i < length - 1; i++) { //相等則加1 if (String.valueOf(arr[i]).equals(String.valueOf(arr[i + 1]))) { count++; //如果count計數比最大記錄數大 if (count != 1 && count > maxNum) { //獲取當前索引位置 index = str.indexOf(arr[i]); maxNum = count; } } else { //當兩者不相等時,初始化count,進行下一次迴圈比較 count = 1; } if (i == length - 1 && String.valueOf(arr[i]).equals(String.valueOf(arr[i - 1]))) { count++; } } //substring(0,2)表示從索引0擷取到索引2 newStr = str.substring(index, index + maxNum); } return newStr; } public static void main(String[] args) { String t = "ssssdddaa"; String t1 = "sssdddaa"; String t2 = "ssssdddddaa"; String t3 = "ssssdddaaaaa"; System.out.println(getString(t)); System.out.println(getString(t1)); System.out.println(getString(t2)); System.out.println(getString(t3)); } }
輸出結果:
ssss
sss
ddddd
aaaaa
Process finished with exit code 0
可能還有些許不全面的部分,但是具體思路是這樣的,如果有不同的或錯誤的謝謝提出。