题目例如以下:
把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);
}
}
}
相对而言另外一种更好理解。答案更easy找到