题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。
分析:这是一道约瑟夫环问题。思路就是按照提中的步骤去执行,很明显用到的数据结构是循环双向链表,关键是循环双链表的实现。见:Stacks,Queues,Linked Lists
public class LastNum{ public static void main(String args[]){ fun(7,2) ; } public static void fun(int n,int m){ MyCircularLinkedList list = new MyCircularLinkedList() ; for(int i=0;i<n;i++){ list.insert(i) ; } MyNode temp = list.first ; while(list.N!=1){ for(int j=0;j<m-1;j++){ temp = temp.next ; } list.del(temp) ; temp = temp.next ; } System.out.println(list.first.key) ; } } class MyCircularLinkedList{ MyNode first ; MyNode last ; int N = 0 ; public void insert(int x){ MyNode newNode = new MyNode(x) ; if(first == null){ first = newNode ; last = newNode ; first.next = last ; last.next = first ; last.pre = first ; first.pre = last ; N++ ; }else{ newNode.next = first ; first.pre = newNode ; last.next = newNode ; newNode.pre = last ; last = newNode ; N++ ; } } public void del(MyNode node){ if(N==1){ first = first ; last = last ; } if(N>1){ if(node==first){ first = node.next ; } if(node==last) last = node.pre ; node.pre.next = node.next ; node.next.pre = node.pre ; } N--; } } class MyNode{ int key ; MyNode next ; MyNode pre ; public MyNode(int x){ key = x ; } }
作者:SpeedMe 发表于2014-4-16 20:20:28 原文链接
阅读:95 评论:0 查看评论