题目如下:
把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);
}
}
}
相对而言第二种更好理解,答案更容易找到
原文地址:http://blog.csdn.net/xlgen157387/article/details/44421333