1. 问题描述:
标题:猜字母
把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容
2. 思路分析:
① 对于这一类删除元素进行移动的问题,经典的做法是声明一个数组,然后对其进行初始化,把那些不需要删除的元素往数组的前面进行移动,所以就需要使用一个变量来记录一次移动之后所在的位置在哪里,对于这道题目来说我们可以先声明一个字符数组然后使用循环对其进行初始化,接下来就是移动数组元素的操作,使用一个变量k记录一次移动之后位置在哪里,第一次把数组的偶数位置的字符都移到前面了,所以k记录的就是下一次我们需要循环到的长度,所以每一轮循环移动结束之后都需要更新下一次循环循环到的数组的位置,这样等到最后更新到下一次循环的长度为1这个时候退出循环然后数组的第一个字符就是我们要求的答案
② 代码如下:
public class Mian {
public static void main(String[] args) {
int len = 2014;
char arr[] = new char[len ];
int index = 0;
for(int i = 0; i < 106; i++){
for(int j = 0; j < 19; j++){
arr[index++] = (char) ('a' + j);
}
}
while(len != 1){
int k = 0;
for(int i = 1; i < len; i += 2){
arr[k++] = arr[i];
}
//k记录下的是下一轮要循环到的长度
len = k;
}
System.out.println(arr[0]);
}
}