Java演算法試題--猜字母/殺人遊戲
阿新 • • 發佈:2019-02-01
題目如下:
把abcd…s共19個字母組成的序列重複拼接106次,得到長度為2014的串。
接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。
得到的新串再進行刪除奇數位置字母的動作。如此下去,最後只剩下一個字母,請寫出該字母。
答案是一個小寫字母,請通過瀏覽器提交答案。不要填寫任何多餘的內容。
public class 猜字母 {
public static void main(String[] args) {
String str = "abcdefghijklmnopqrs";
String str1 = "" ;
for (int i = 0; i < 106; i++) {
str1 = str1 + str;
}
System.out.println(str1.length());
boolean[] arr = new boolean[str1.length()];
for (int i = 0; i < arr.length; i++) {
arr[i] = true;// 下標為TRUE時說明字母還在圈裡
}
int leftCount = str1.length();
int countNum = 0;
int index = 0;
while (leftCount > 1) {
if (arr[index] == true) {// 當在圈裡時
if (countNum % 2 == 0) {// 下標為偶數時
arr[index] = false;// 該字母退出圈子
leftCount--;// 剩餘字母數目減一
}
countNum++;
}
index ++;// 每報一次數,下標加一
if (index == str1.length()) {// 是迴圈數數,當下標大於n時,說明已經數了一圈,
index = 0;// 將下標設為零重新開始。
countNum = 0;
}
}
// 打印出最後一個
for (int i = 0; i < str1.length(); i++) {
if (arr[i] == true) {
System.out.println(i);// 輸出結果表示下標為1023(第1024個)的字母,即:q
}
}
}
}
第二種解法:
public class 猜字母1 {
public static void main(String[] args) {
String str2 = "";
String str = "abcdefghijklmnopqrs";
for (int i = 0; i < 105; i++) {
str = str + "abcdefghijklmnopqrs";
}
System.out.println(str.length());
while (str.length() != 1) {
for (int i = 0; i < str.length(); i++) {
if (i % 2 == 1) {
str2 += str.charAt(i);
}
}
str = str2;
str2 = "";
System.out.println(str);
}
}
}
相對而言第二種更好理解,答案更容易找到