藍橋杯猜字母用單向連結串列實現
阿新 • • 發佈:2019-02-12
標題:猜字母
把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); } }