java名侦探柯南游戏大全_孩子们的游戏(圆圈中最后剩下的数),Java代码实现思路分享...

下面给大家分享的是一个Java代码实例,下面一起来了解一下吧。

抽象建模能力

题目:

让小朋友们围成一个大圈,之后,随机指定一个数m,让编号为0的小朋友开始报数。

每一次,喊到了m-1的那个小朋友要出列唱一首歌,然后可以在礼品箱中随意的挑选礼物,并且不用再回到圈中,从他的下一个小朋友开始,继续0...m-1报数,一直到剩下最后一个小朋友,就可以不用表演,并且拿到名侦探柯南典藏版(名额有限)。

问:哪个小朋友会得到名侦探柯南典藏版?

注:小朋友的编号是从0到n-1

假如没有小朋友,请返回-1

思路1:

用数组来模拟环,思路还是比较简单,但是各种下标要理清

代码实现:public static int findLastNumber(int n, int m)

{

if (n 

int[] array = new int[n];

int i = -1, step = 0, count = n;

while (count > 0)

{ //跳出循环时将最后一个元素也设置为了-1

i++; //指向上一个被删除对象的下一个元素。

if (i >= n) i = 0; //模拟环。

if (array[i] == -1) continue; //跳过被删除的对象。

step++; //记录已走过的。

if (step == m)

{ //找到待删除的对象。

array[i] = -1;

step = 0;

count--;

}

}

return i; //返回跳出循环时的i,即最后一个被设置为-1的元素

}

思路2

代码实现:public class Solution

{

public int LastRemaining_Solution(int n, int m)

{

if (m <= 0 || n <= 0)

{

return -1;

}

//先构造循环链表

ListNode head = new ListNode(0); //头结点, 值为0

ListNode pre = head;

ListNode temp = null;

for (int i = 1; i 

{

temp = new ListNode(i);

pre.next = temp;

pre = temp;

}

temp.next = head; //将第n-1个结点(也就是尾结点)指向头结点

ListNode temp2 = null;

while (n != 1)

{

temp2 = head;

//先找到第m个结点的前驱

for (int i = 1; i 

{

temp2 = temp2.next;

}

//删除第m个结点:将第m个结点的前驱指向第m个结点后面那个结点,temp2表示第m个结点的前驱

temp2.next = temp2.next.next;

head = temp2.next; //更新头结点

n--;

}

return head.value;

}

}

/**

* 结点

*/

class ListNode

{

int value;

ListNode next = null;

public ListNode(int val)

{

this.value = val;

}

}

思路3

代码实现:import java.util.ArrayList;

public class Solution

{

public int LastRemaining_Solution(int n, int m)

{

if (n == 0)

return -1;

ArrayList  array = new ArrayList  ();

for (int i = 0; i 

{

array.add(i);

}

int tempIndex = (m - 1) % array.size(); //用于记录最初需清除的数字索引

while (array.size() != 1)

{

//System.out.println(array.get(tempIndex));

array.remove(tempIndex);

tempIndex = (tempIndex + (m - 1)) % array.size(); //记录当前索引

}

return array.get(0);

}

}

更多的抽象建模能力Java实例,可以继续关注本站了解哦,有更多相关内容,可以分享给大家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值