zoukankan      html  css  js  c++  java
  • 约瑟夫环(CVTE、网易2014.3.16笔试题offerP228)

    题目:0,1,2,……,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

    法一:用环形链表模拟圆圈的经典算法(时间复杂度O(nm),空间复杂度O(n)

    法二:分析数学规律的高效算法。(时间复杂度O(n),空间复杂度O(1)

    http://www.blogjava.net/rorely/archive/2010/01/15/309732.html

    //约瑟夫环,通过测试
    /*
    OFFER P288:0,1,2,……,n-1这n个数字组成圆圈,从0开始每次从这个圆圈里删除第m个数字。求最后一个剩下的数字
    JAVA面宝P194:30个人围成一圈,数到9的人出列,求最后剩下的15个人
    */
    public class JosephuseRing{
        public static void main(String[] args){
            int data[]={0,1,2,3,4};
            josephuseRing(data,3);
        }
        public static void josephuseRing(int data[], int n){       
            int len=data.length;//初始长度,以后出圈一个,长度就减一
            int last=-1;               //保存最后一个数      
            int i=0;                    //i为元素下表
            int j=1;                    //j代表当前要报的数
            while(len>0){
                if(data[i%data.length] != -1){//非空位
                    if(j%n==0){//找到要出圈的人,并把圈中人数减一
                        //System.out.print(data[i%data.length]+"  ");
                        last=data[i%data.length];
                        data[i%data.length]=-1;//输出后将其值置为-1,即无效值
                        j=1;
                        i++;
                        len--;
                    }else{
                        i++;
                        j++;
                    }
                }else{//遇到空位了,就跳到下一位,但j不加一,也就是这个位置没有报数
                    i++;
                }
            }
            System.out.println("the last number is "+last);
        }
    }
    
        
  • 相关阅读:
    中国剩余定理及其扩展
    扩展欧几里得
    乘法逆元
    58-63用ssh远程连接linux系统
    148复习前一天的内容
    165-168函数
    Linux运维命令总结(-)
    177流程控制经典案例讲解
    170-176流程控制
    161【案例讲解】存储过程
  • 原文地址:https://www.cnblogs.com/seven7seven/p/3668952.html
Copyright © 2011-2022 走看看