约瑟夫环问题华为机试题

来源:互联网 发布:达芬奇调色软件下载 编辑:程序博客网 时间:2024/06/06 15:38

问题描述:

约瑟夫环是一个数学的应用问题:已知n个人(以编号123...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。

解决步骤:

1)、首先针对每一个孩子建立一个节点,这个节点应该包括:节点编号和下个节点的指针:

package com.hnu.domain;

/**

 *这个是建立节点类

 *@authormaqiang

 *

 */

publicclass Child {

   publicintno;

   public ChildnextChild;

   public Child(int no) {

      this.no = no;

   }

}

 

2)、针对这些孩子节点,我们要建立一个环形链表并且还要针对这个环形链表给出一个出      列的函数:
package com.hnu.service;

import com.hnu.domain.Child;

publicclass ChildService {

   /**

    *

    * @param head创建一个圆环的头指针

    * @param totalChild总共有多少个孩子

    * @return返回一个圆环的头指针

    */

   publicstatic Child createcircle(Child head,int totalChild)

   {

      Child currentChild=null;

      for(int i=1;i<=totalChild;i++)

      {

         Child tmp=new Child(i);

         if(i==1)

         {

            head=tmp;

            currentChild=tmp;

            currentChild.nextChild=head;

         }

         else

         {

            currentChild.nextChild=tmp;

            currentChild=currentChild.nextChild;

            currentChild.nextChild=head;

         }

      }

      return head;

   }

  

   /**

    * 打印出列的顺序

    * @param head圆环的头指针

    * @param no 第几个人出列

    */

   publicstaticvoid outQueue(Child head,int no)

   {

      //目前节点

      Child currentChild=head;

      //保存前节点,为了删除出列节点,再建立链表

      Child priorChild=null;

      while(currentChild!=currentChild.nextChild)

      {

         for(int i=1;i<no;i++)

         {

            priorChild=currentChild;

            currentChild=currentChild.nextChild;

         }

         System.out.print(currentChild.no+"——>");

         //删除出列节点,然后从删除节点的下一节点开始数数

         priorChild.nextChild=currentChild.nextChild;

         //要从删除节点的下一节点开始计数,所以要把currentChild往下移动一个节点

         currentChild=priorChild.nextChild;

      }

      System.out.print(currentChild.no);

   }

}

3)、测试我们的算法是否正确:

package com.hnu.main;

 

import com.hnu.domain.Child;

import com.hnu.service.ChildService;

 

publicclass MainTest {

 

   /**

    * @param args

    */

   publicstaticvoid main(String[] args) {

      // TODO Auto-generated method stub

      Childhead=null;

      Childhead_pointer=ChildService.createcircle(head, 6);

      ChildService.outQueue(head_pointer, 2);

     

   }

 

}

 

原创粉丝点击