把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
一开始我用字符串写,发现我无法改变字符串中的某个位置的字符,但是可以用“”来替换某个字符实现删除某个字符。后来我用想用字符数组,但是字符数组不能实现简单的删除,删除很麻烦。最终用了List。
还有一个比较重点的一个问题,因为我在删除List中的某个数时,他们的位置都不在是原来的位置,如果我还是继续删除3,5,7等位置明显不对,所以当删除一个字母时,后面的位置都会相应减1,所以我要i–,在for循环中是i += 2.
for (int i = 0; i < temp.size(); i += 2) {
temp.remove(i);
i--;
}
后来也尝试过一个方法,就是我每次不删要删的字符而是记录下来,然后循环完一遍后,再一下子全删了,逻辑似乎不错,可是List中有很多重复的,比如说我要删,a,b,实际只删一个,但是他会全部删了。
import java.util.ArrayList;
import java.util.List;
public class okt3猜字母 {
public static void main(String[] args) {
f1();
// f2();
// f3();
}
private static void f3() {
// TODO Auto-generated method stub
String s = "abcdefghijklmnopqrs";
char[] ss = s.toCharArray();
List<Character> ll = new ArrayList<Character>();
for (int i = 0; i < 106; i++) {
for (int j = 0; j < ss.length; j++) {
ll.add(ss[j]);
}
}
while (ll.size() != 1) {
int length = ll.size();
List<Character> temp = new ArrayList<Character>();
temp = ll;
for (int i = 0; i < temp.size(); i += 2) {
temp.remove(i);
i--;
}
ll = temp;
}
System.out.println(ll.get(0));
}
public static void f1() {
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's' };
ArrayList<Character> arrayList = new ArrayList<Character>();
for (int i = 0; i < 106; i++) {
for (int j = 0; j < 19; j++) {
arrayList.add(a[j]);
}
}
// System.out.println(arrayList.size());
while (arrayList.size() > 1) {
// ArrayList<Character> temp = new ArrayList<Character>();
int jj = 0;
int len = arrayList.size();
for (int i = 0; i < len; i += 2) {
// temp.add(arrayList.get(i));
// System.out.println(arrayList.get(i - jj) + "........");
arrayList.remove(i - jj);
jj++;
}
// arrayList.removeAll(temp);
// System.out.println(arrayList.size());
}
// System.out.println(arrayList.size());
System.out.println(arrayList.get(0));
}
public static void f2() {
char[] a = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's' };
ArrayList<Character> arrayList = new ArrayList<Character>();
// for (int i = 0; i < 106; i++) {
for (int j = 0; j < 19; j++) {
arrayList.add(a[j]);
}
// }
// System.out.println(arrayList.size());
while (arrayList.size() > 1) {
ArrayList<Character> temp = new ArrayList<Character>();
int jj = 0;
int len = arrayList.size();
for (int i = 0; i < len; i += 2) {
temp.add(arrayList.get(i));
}
arrayList.removeAll(temp);// 移除arraylist中所有与temp相等的元素,而arraylist中本身就有很多重复元素,所以会出错
System.out.println(arrayList.size());
}
System.out.println(arrayList.size());
System.out.println(arrayList.get(0));
}
}