题目
猜字母
把abcd…s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
解题思路
1、 需要每次对元素进行操作,所有我们考虑放在一个list集合里面,然后对里面的元素进行操作,循环将list里的奇数元素删除即可,但是这里需要注意的是,list里面remove完一个元素后,会影响索引位置,所有我们可以先将所有奇数位置上的元素替换,然后再去掉就可以了。
2、 第二种思路是,先把元素存入char数组里面,然后通过两个增长速率不同的变量,完成对char数组的更新,重复循环,直到元素剩余一个输出即可。
参考代码
第一种思路
package JavaB14;
//标题:猜字母
//把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
//接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
//得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
//答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
import java.util.ArrayList;
import java.util.List;
public class three {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
for(int i=0;i<106;i++) {
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
list.add("g");
list.add("h");
list.add("i");
list.add("j");
list.add("k");
list.add("l");
list.add("m");
list.add("n");
list.add("o");
list.add("p");
list.add("q");
list.add("r");
list.add("s");
}
System.out.println(list.size());
find(list);
}
public static void find(List<String> list) {
while(list.size()>1) {
for(int i=0;i<list.size();i++) {
if(i%2==0) {
list.set(i, "1");
}
}
for(int i=0;i<list.size();i++) {
list.remove("1");
}
}
System.out.println(list);
}
}
第二种思路
package JavaB14;
public class three2 {
public static void main(String[] args) {
char [] ch=new char[2014];
int index=0;
for(int i=0;i<106;i++) {
for(int j=0;j<19;j++) {
ch[index++]=(char) ('a'+j);
}
}
int len=2014;
while(len!=1) {
int k=0;
for(int i=1;i<len;i+=2) {
ch[k++]=ch[i];
}
len=k;
}
System.out.println(ch[0]);
}
}