标题:猜字母
把abcd...s共19个字母组成的序列重复拼接106次,得到长度为2014的串。
接下来删除第1个字母(即开头的字母a),以及第3个,第5个等所有奇数位置的字母。
得到的新串再进行删除奇数位置字母的动作。如此下去,最后只剩下一个字母,请写出该字母。
答案是一个小写字母,请通过浏览器提交答案。不要填写任何多余的内容。
/*1.用1~2014的数字来填进结点中
2.循环,若结点数据时奇数就删除掉该节点
3.遍历结点个数allnumber
4.将剩下的结点重新从1到allnumber赋值
5.循环直到链表长度为1*/
//结点里面既能存数字,又能存字母,字母是不变的,每个结点对应的数字可变
class Dnode{
int data;
char ch;
Dnode next;
}
/*1.将19个字母,106组用循环存进数组里面,长度为2014
2.构建新链表,将1~2014赋给链表的每个元素
3、将数组的每个字母赋给对应的结点*/
class mList{
String str="abcdefghijklmnopqrs";
Dnode head=new Dnode();
Dnode tail=head;
Dnode ptr;
void createList(){
int j=1;
while (j<=2014){
ptr=new Dnode();
ptr.data=j;
tail.next=ptr;
ptr.next=null;
tail=ptr;
j++;
}
int count=0;
int i=0;
Dnode ptr=head.next;
while (i<=19){
if (i==19){
i=0;
}
if (count==2014){
break;
}
ptr.ch=str.charAt(i);
ptr=ptr.next;
count ++;
i ++;
}
}
/*1.删除结点之前,先按顺序重新给结点赋数字
2.遍历链表,若是奇数,就删除该节点*/
void deleteList(){
//int all=ergodic();
//从1开始重新赋值
int i=1;
Dnode myNode=head.next;
while (myNode!=null){
myNode.data=i;
myNode=myNode.next;
i++;
}
myNode=head;
while (myNode!=null&&myNode.next!=null){
if (myNode.next.data%2!=0){
myNode.next=myNode.next.next;
myNode=myNode.next;
}
}
//遍历结点个数
int ergodic(){
Dnode myNode=head.next;
int count=0;
while (myNode!=null){
count++;
myNode=myNode.next;
}
return count;
}
void printList(){
Dnode myNode=head.next;
while (myNode!=null){
System.out.print(myNode.ch+",");
System.out.println(myNode.data+"");
myNode=myNode.next;
}
}
}
public class Guess {
public static void main(String[] args) {
// TODO Auto-generated method stub
int time=1;
mList li=new mList();
li.createList();
System.out.println("第一次输出:");
li.printList();
System.out.println("第一次输出结束!");
//循环删除元素,缩短链表,直到只剩下一个结点
do {
System.out.println("第"+time+"次输出:");
li.deleteList();
li.printList();
time ++;
if (li.ergodic()==1){
System.out.println("所得的字母是"+li.head.next.ch+"");
}
}while (li.ergodic()!=1);
}
}