猴子选大王 华为OJ

//这个问题就是一个典型的猴子选大王的问题,解决档案方案有很多,在做这个题目的时候,我直接想起来的时标记和Arraylist,下面介绍下

1 标记,也就是对每一个出列的猴子原来的数进行更改,这里更改成0,以后就不对他进行判断了。

import java.util.*;

public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();

int[] a=new int[n+1];

//使得数组的每一个值都跟他所在的位置相同。

for(int i=1;i<n+1;i++)
a[i]=i;
int k=0;//标记3的倍数
int i=1;//标记报数报刀第几个,当报道第n+1个的时候,就把它变回到第一个。
int out_push=0;//标记出来了多少个

while(out_push<n-1){

//如果a[i]还在队里,就让k++,也就是使下一个猴子报123中的下一个数

if(a[i]!=0){
k++;

}

//当某个猴子报数报道3的时候,出队,出队的变量+1,令这个的值为0.同时,使k=0。重新从1开始报数。

if(k==3){
a[i]=0;
k=0;
out_push++;

}

//下一个猴子报数

i++;

//如果报数报到了4,就要回到第一个进行重新报数。

if(i==n+1){
i=1;
}

}

//最后剩一个,输出

for(int j=1;j<=n;j++)
if(a[j]!=0){
System.out.println(a[j]);
}
}
}

}




2

用到ArrayList 


import java.util.*;
public class huiwen{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
ArrayList list=new ArrayList();
int n=sc.nextInt();

//添加元素
for(int i=1;i<=n;i++)
list.add(i);
out(list,3);

}

}


public static void out(ArrayList list,int n){
int count=0;

//当队列中不止一个时
while(list.size()>1){

//转换
Iterator tor=list.iterator();

//一圈圈的循环
while(tor.hasNext()){

//下一个
int x=(Integer) tor.next();
count++;
if(count==n){
tor.remove();
count=0;
}
}
}

//输出剩下的一个,也就是国王
System.out.println(list.get(list.size()-1));

}

}

第二种方法借鉴http://skyuck.iteye.com/blog/868930,感谢版主

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值