该题是尚学堂马世兵老师经讲过的一道题,题目是这样的:
一群小孩围成一个圈,其中一个小孩从1开始报数,报到3的小孩退出,下一个小孩接着从1报数,直到剩下最后一个小孩,算出这名小孩是谁?
当时讲了两种方式,一种是数组的方式,一种是链表的方式,下面就讲一下链表的方式。
1.Kid类
代码:
/** * 小孩 * @description Kid.class * @author zkf * @createTime 2013-7-16 */ class Kid{ private int id; private Kid left;//左手边小孩 private Kid right;//右手边小孩 public Kid(int id) { this.id = id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Kid getLeft() { return left; } public void setLeft(Kid left) { this.left = left; } public Kid getRight() { return right; } public void setRight(Kid right) { this.right = right; } }
2.模拟一个双向链表
代码:
/** * 链表 * @description LinkList.class * @author zkf * @createTime 2013-7-16 */ class LinkList{ int count = 0;//大小 Kid last;//结尾 Kid first;//开头 /** * 增加Kid * @author zhangkefei * @createTime 2013-7-16 * @return void */ public void add(Kid kid){ if(count == 0){ last = kid; first = kid; kid.setLeft(last); kid.setRight(first); }else { kid.setLeft(last); kid.setRight(first); last.setRight(kid); first.setLeft(kid); last = kid; } count ++; } /** * 移除一个Kid * @author zhangkefei * @createTime 2013-7-16 * @return void */ public void move(Kid kid){ if(count == 0){ return; }else if(count == 1){ first = last = null; }else { kid.getLeft().setRight(kid.getRight()) ; kid.getRight().setLeft(kid.getLeft()); if(kid == first){ first = kid.getRight(); }else if(kid == last){ last = kid.getLeft(); } } count--; } /** * 返回链表的大小 * @author zkf * @createTime 2013-7-16 * @return int */ public int getCount() { return count; } /** *返回链表第一个孩子 *@author zkf *@createTime 2013-7-16 *@return Kid */ public Kid getLast() { return last; } /** *返回最后一个孩子 *@author zkf *@createTime 2013-7-16 *@return Kid */ public Kid getFirst() { return first; } }
3.客户端测试
代码:
/** * 链表形式实现下面功能 * @description Test_11_Example.class * @author zkf * @createTime 2013-7-16 */ public class Test { public static void main(String[] args) { //添加500元素 LinkList ll = new LinkList(); for (int i = 0; i < 500; i++) { ll.add(new Kid(i)); } //数到三 删除一个元素 int flag=1; Kid kid = ll.getFirst(); while(ll.getCount() >1){ if(flag == 3){ ll.move(kid); flag = 1; }else { flag++; } kid = kid.getRight(); } System.out.println(ll.getFirst().getId()); } }
4.结果:
435
相关推荐
Java算法设计资料主要涵盖的是如何使用Java语言进行有效的算法实现和设计。算法是计算机科学的基础,对于解决复杂问题和优化程序性能至关重要。本资料重点可能是《算法》这本书的第四版,这是一本广泛认可的算法教材...
Java算法大全源码包是一个集合了多种经典算法实现的资源包,主要面向Java开发者,旨在帮助他们深入理解和应用计算机科学中的各种算法。这个源码包可能包含了排序、搜索、图论、动态规划、贪心算法、回溯、分治等多...
总的来说,这份资源是JAVA算法学习者的宝典,通过深入学习和实践其中的算法,开发者可以全面提升自己的编程技能,为解决实际问题打下坚实的基础。无论是初学者还是经验丰富的开发者,都可以从中受益匪浅。因此,对于...
在这个名为"AlgorithmGossip"的压缩包文件中,我们可以期待找到一些与Java算法相关的知识点和实践示例。 在Java中,经典算法主要包括排序、查找、图算法、动态规划、贪心算法、回溯法等。以下是对这些关键概念的...
排序是计算机科学中最基础也是最重要的算法之一,它的目标是将一组数据按照特定顺序排列。C语言和Java中常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序以及堆排序等。每种排序算法都有其独特...
Java算法是编程领域中的核心部分,它涉及到计算机科学的基础理论和实际编程技巧。这份"Java经典算法(PPT资源)"包含了9个章节,旨在深入讲解如何使用Java语言来实现各种算法,帮助开发者提升解决问题的能力和代码效率...
Java常见算法大全是针对Java程序员的一份宝贵资源,旨在帮助他们深入理解和熟练运用各种算法,提升编程技能。在计算机科学中,算法是解决问题的关键,它是一系列清晰定义的步骤,用于执行特定任务或解决特定问题。...
Java数独题库高效生成算法代码是用于创建各种难度级别的9x9数独谜题的程序。数独是一种逻辑推理游戏,目标是在一个9x9的网格中填入数字,使得每一行、每一列以及每一个3x3的小宫格内的数字都从1到9不重复。这种算法...
总结这两种方法,Java中的"数三退一"游戏实现主要依赖于循环(while)和递归两种控制流程。while循环适用于简单的迭代逻辑,而递归则更适合复杂的问题分解。在实际应用中,应根据具体需求和性能要求选择合适的方法。...
Java开发中的经典算法是开发者必须掌握的核心技能,它们能够有效地解决复杂的问题并优化程序性能。以下将详细阐述标题和描述中提到的八大算法: 1. **迭代法**:迭代是通过重复执行一个过程来达到某个结果的过程。...
2. **Failure表(Failure链接)**:Failure表是Aho-Corasick算法的核心,它记录了当当前状态无法通过Goto表进行有效转移时,应该回退到哪个状态。这样,即使当前字符不匹配模式串中的下一个字符,算法也能快速恢复并...
在这个名为"Java,用java实现的所有算法.zip"的压缩包中,很显然,它包含了一个Java项目,专注于实现各种算法。这样的资源对于学习和理解数据结构与算法在实际编程中的应用非常有价值。 首先,让我们探讨一下Java...
在Java中,我们可以创建一个方法,例如`calculate24(int num1, int num2, int num3, int num4)`。这个方法可以有以下几个步骤: 1. **基础情况**:如果只剩一个数,检查其是否等于24。 2. **组合运算**:对于剩余的...
Java算法是编程领域中的核心部分,对于任何Java开发者来说,理解和掌握这些算法都是非常重要的。这份“十分有用的java算法”课件涵盖了多个章节,包括从基础到高级的各种算法,旨在帮助学习者深入理解并能实际应用。...
《算法设计与分析代码(Java实现)》是一个包含多个算法实例的编程资源,主要基于王晓东教授的《算法设计与分析》教程。这个压缩包旨在帮助读者深入理解并实际操作书中的各种算法,通过Java语言将理论转化为可执行的...
主要思想:用二维数组表示数独,将为0的下标用一维数组表示,从小到大依次试探每一个可能的数,填充,若皆不可能,则回退到上一个数从上一个数的可能值+1开始,同时将以后的数重新置为0,特别注意的是,回退后求得解...
Java算法大全是一个集合了近百种常见算法的资源包,对于想要深入学习Java编程语言和算法的开发者来说,这是一个非常宝贵的资料库。这个压缩包中包含了各种类型的算法实现,旨在帮助学习者理解和掌握如何在Java中有效...
Java算法大全源代码是编程学习者和开发者的重要资源,它涵盖了多种经典的算法实现,这些算法在实际编程中有着广泛的应用。下面将详细讲解这个资源中可能包含的一些关键知识点,并阐述它们的重要性。 首先,Java算法...
3. **查找算法**: - **顺序查找**:线性遍历查找目标元素。 - **二分查找**:只适用于有序数组,每次查找都将范围缩小一半。 - **哈希查找**:通过哈希函数快速定位元素,常用于解决查找效率问题。 - **二叉...