深圳同城快跑笔试题目 1 约瑟夫环

参见

http://www.cnblogs.com/cici-new/p/3154553.html

package com.cici.linknode;

public interface Node{

    public Object data = null;

           public Node next = null;

           public void display();

}

 

 

package com.cici.linklist.exercise;
import com.cici.linknode.LinkNode;

package com.cici.linknode;
/**
 * Copyright:   WANGCH
 * Company:     WANGCH
 * @fileName: LinkNode.java
 * @Description:
 * @Create date: 2013-6-20 上午12:14:31
 * @Create by: wangchao(wangchao_new@163.com)
 * @Update Date: 2013-6-20 上午12:14:31
 * @Update by: WANGCH(wangchao_new@163.com)
 * @version 5.1
 */

public class LinkNode implements Node{
    public int iData;//data
    public double dData;//data
    public LinkNode next; //reference to next link
    
    //constructor
    public LinkNode(int id,double dd){
        iData = id;
        dData = dd;
    }
    public void display(){
        //display itself
        System.out.println
        ("iData  :  "+iData+"    dData:"+dData);
    }
}//end class LinkNode
package com.cici.linklist.exercise;

import com.cici.linknode.LinkNode;

/**
 * Copyright:   WANGCH
 * Company:     WANGCH
 * @fileName: CircleListNew.java
 * @Description:
 * @Create date: 2013-6-24 下午11:53:36
 * @Create by: wangchao(wangchao_new@163.com)
 * @Update Date: 2013-6-24 下午11:53:36
 * @Update by: WANGCH(wangchao_new@163.com)
 * @version 5.1
 */
/*单链表节点实现的有序循环链表*/
public class CircleList {
    private LinkNode current;//当前节点的指针
    public int nItems;//链表内节点个数
    public CircleList(){
        current = null;
    }
    public LinkNode peek() { // 返回最早插入的元素  
        // 调用前要判断是否为空  
        return current.next;  
    }  
    public LinkNode find(int value) {  
        LinkNode temp = current; // 保存原来的位置  
        do{
            if(current.iData == value) return current;
            stepNext();
        }while(current!=temp);
      
        throw new RuntimeException("不能找到该值 :"+value);
    }
    //添加新元素
    public void insert(LinkNode node){
        if(isEmpty()) {
            node.next = node;
            current = node;// 插入元素,current要移动要新元素  
        }else{
            node.next = current.next;
             current.next = node;
             current = node;// 插入元素,current要移动要新元素  
            
        }
        nItems++;
    } 
    //当前元素无法删除自身 只能删除当前元素的下一个元素
  public LinkNode remove() {  
     // list为空是没有考虑,在调用remove之前应该判断是否为空 
      if(isEmpty()){
            throw new RuntimeException("链表当前为空 ,不能删除操作");
        }
      LinkNode temp = current.next;// 删掉current的下一个元素  
      if (current.next == current) { // 只有一个元素时  
          current = null;  
      } else {  
          current.next = current.next.next;  
      } 
        nItems--;
        return temp;
    }
 
    public void displayList() {
        if(isEmpty()){
            throw new RuntimeException("链表当前为空 ,不需要显示");
        }
            LinkNode temp = current;
            do {
                // 从current
                stepNext();
                current.display();
            } while (current != temp);
            System.out.println();
    }
    
    /*指针移向下一处节点,返回指针指向的最新节点 */
    public LinkNode stepNext(){
        if(isEmpty())
            throw new RuntimeException
            ("链表当前为空,指针不能移向下一个节点");
        current = current.next;
        return current;
    }
     public int size() {  
            return nItems;  
        }  
    public boolean isEmpty(){
        return current== null;
    }
    public static void main(String[] args) {
        LinkNode node1 = new LinkNode(10,10.1);
        LinkNode node2 = new LinkNode(20,20.2);
        LinkNode node3 = new LinkNode(5,5.5);
        CircleList list = new CircleList();
        list.insert(node1);
        list.insert(node2);
        list.insert(node3);
        System.out.println("Before delete");
        list.displayList();
        System.out.println("After delete");
        list.remove();
        list.displayList();
        
        /*int target = list.find(20).iData;
        System.out.println("找到的值为"+target);*/
    }
}
package com.cici.linklist.exercise;

import com.cici.linknode.LinkNode;

/**
 * Copyright:   WANGCH
 * Company:     WANGCH
 * @fileName: JosephusRing.java
 * @Description:
 * @Create date: 2013-6-22 下午8:03:34
 * @Create by: wangchao(wangchao_new@163.com)
 * @Update Date: 2013-6-22 下午8:03:34
 * @Update by: WANGCH(wangchao_new@163.com)
 * @version 5.1
 */
/*5.5 Josephus问题是古代一个著名的数学难题。围绕这个问题有很多故事。其 
中一个说Josephus是一群被罗马人抓获的犹太人中的一个,为了不被奴役, 
他们选择自杀。他们排成一个圆圈,从某个人开始,沿着圆圈计数。每报 
第n个数的人就要离开圆圈去自杀。Josephus不想死,所以他制定了规则, 
以使他成为最后一个离开圆圈的人。如果有(例如)20个人的话,他就是 
从开头数第7个人,那么他让他们用什么数来进行报数呢?这个问题会越来 
越复杂,因为随着过程进行,圆圈在缩小。使用5.3题的循环链表创建一个 
应用来模拟这个问题。输入是组成圆圈的人数,要报的数和第一个开始报的 
人的位置(通常是1)。输出是被消去的人的列表。当一个人出了圆圈,再 
继续从他左边那个人开始计数(假设沿顺时针旋转)。这有一个例子。有7 
个人,从1到7,从第一个人开始报数,报到4出圆圈,最后被消去的人的顺 
序是4,1,6,5,7,3。最后剩下的人是2。*/
public class JosephusRing {
        public static LinkNode  getJosephus(int number){
            CircleList circleList=
            new CircleList();
            //Initialise the link list
        for (int i=1;i<=number;i++){
            LinkNode node =
                    new LinkNode(i,i+0.1);
            circleList.insert(node);
        }
        System.out.println("原始的圈子:");
        circleList.displayList();
        System.out.println("出圈子的顺序 :");
 
        while(circleList.nItems!=1){
            System.out.println("圈子中的人数 :"+circleList.nItems );
            for(int j=1;j<4;j++)
                circleList.stepNext();
            System.out.print(circleList.remove().iData + " ");
        }
        System.out.println();
        return circleList.peek();    
        }
        public static void main(String[] args) {
            LinkNode number = 
                    JosephusRing.getJosephus(7);
            System.out.println("Josephus的编号是 :"+ number.iData);
        }
}

 

posted @ 2015-05-18 17:15  王超_cc  阅读(212)  评论(0编辑  收藏  举报