下面给大家分享的是一个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实例,可以继续关注本站了解哦,有更多相关内容,可以分享给大家。