• 深圳同城快跑笔试题目 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);
            }
    }
  • 相关阅读:
    获取字符串最长不重复子串
    斐波那契数列&&上台阶
    mysql 索引
    Python unittest框架实现appium登录
    解决RedisDesktopManager连接不上redis问题
    Nginx配置---启用gzip压缩
    Nginx配置---同一端口下部署不同项目
    Nginx配置---解决History路由报错问题
    个人网站搭建基本流程
    Create-React-App项目中CSS Modules的使用
  • 原文地址:https://www.cnblogs.com/cici-new/p/4512411.html
Copyright © 2020-2023  润新知