把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。q
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
有两种解题思路:
- 加标志为,标志已经处理的元素,之后不在进行任何处理
- 删除一个元素,后面元素的移动到删除的位置,不断循环
// An highlighted block
public class Demo_5_03 {
public static void main(String[] args) {
String s=new String("abcdefghijklmnopqrs");
StringBuffer sd=new StringBuffer();
for(int i=1;i<=106;i++) {
sd.append(s);
}
char[] arr=sd.toString().toCharArray();
//1、加标志位确定删除的元素,不用移动元素
f1(arr);
//2、移动数组元素,逐渐缩小范围
f2(arr);
}
public static void f1(char[] arr) {
int n=arr.length;
ok:while(true) {
boolean flag=true; //2、判断该字母是不是在奇数位
for(int i=0;i<arr.length;i++) {
if(n==1) {
break ok;
}
if(arr[i]=='0') { //、说明该字母已经被清除,可以跳过
continue;
}
//、如果字母是奇数位的则清除,并标志,以后直接跳过
if(flag) {
arr[i]='0';
n--;
flag=false;
//、说明是偶数位
}else {
flag=true;
}
}
}
for(int i=0;i<arr.length;i++) {
if(arr[i]!='0') {
System.out.println(arr[i]);
}
}
}
public static void f2(char[] arr) {
int n=arr.length;
while(n!=1) {
int k=0; //2、k是每次存放新元素的起点
for(int i=1;i<n;i+=2) {
arr[k++]=arr[i];
}
n=k;
}
System.out.println(arr[0]);
}
}