上网看了很多解决该问题的思路是面向过程的,用java写了个面向对象的,其实这就是一个循环的双向链表结构。
就一个kid类模拟小朋友,属性:id,左手拉的小孩,右手拉的小孩。行为:数数字和退出。代码如下:
传统面向过程思想:
import java.util.ArrayList;
import java.util.List;
public class Count3exit1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 500; i++) {
int id = i + 1;
list.add(id);
}
int count = 0;
while (!list.isEmpty()) {
for (int i = 0; i < list.size(); i++) {
count++;
if (count == 3) {
System.out.println("可怜的小朋友:" + list.remove(i));
i--;
count = 0;
}
}
}
}
}
面向对象思想:
import java.util.ArrayList;
import java.util.List;
/**
* 小朋友
*
* @author Administrator
*
*/
public class Kid {
public int id;// 小朋友id
public Kid left;// 小朋友左收拉的小朋友
public Kid right;// 小朋友右手拉的小朋友
public Kid(int id) {
this.id = id;
}
/**
* 小朋友数数字,数到3的倍数就退出,
*
* @param number
* 小朋友数的数字
* @return 左手拉自己,右手也拉自己的小朋友(即最后一个小朋友)
*/
public Kid count(int number) {
if (left == this && right == this) {
return this;
}
if (number % 3 == 0) {
System.out.println("可怜的小朋友:" + id);
this.exit();
}
number++;// 数的数字加1
/**
* 下一个小朋友接着数数字
*/
return this.right.count(number);
}
/**
* 小朋友退出,并将左右手的小朋友互相拉手
*/
public void exit() {
this.left.right = this.right;
this.right.left = this.left;
}
public static void main(String[] args) {
/**
* 找齐500个小朋友
*/
List<Kid> kids = new ArrayList<Kid>();
for (int i = 0; i < 600; i++) {
int id = i + 1;
kids.add(new Kid(id));
}
/**
* 所有小朋友围成一圈拉好手
*/
for (int i = 0; i < kids.size(); i++) {
if (i == 0) {
kids.get(i).left = kids.get(kids.size() - 1);
} else {
kids.get(i).left = kids.get(i - 1);
}
if (i == kids.size() - 1) {
kids.get(i).right = kids.get(0);
} else {
kids.get(i).right = kids.get(i + 1);
}
}
/**
* 从1个小朋友开始数1
*/
Kid lastKid = kids.get(0).count(1);
System.out.println("最后一个小朋友:" + lastKid.id);
}
}
分享到:
相关推荐
数三退一,双向链表,Count1Quti2
N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。 定义一个类,然后在类前定义一个结构体 2、在类中定义一个链表...
针对现在经典问题10个人循环报数问题编写的python实现,循环中的100次循环其实可以改为使用while实现,那个比for循环好一点。同样的可以将10个人改为任意的人数,只要不超过int限制
1. 多挡位:3进3退的设计提供了更多的速度选择,使得叉车在各种工况下都能保持良好的行驶性能。 2. 灵活性:多个挡位使得叉车在狭窄空间内的操作更为便捷,提高了工作效率。 3. 可靠性:经过优化设计的齿轮和离合器...
这个是用JAVA实现的数三退一的源代码,是用双链表实现的,不知道对大家有没有用,可以看看,对于大学里老师可能会让人做这样的题目,可能看对大家有帮助哦
这种方法的核心思想是,在遇到不可行的选择时能够回退到上一步,并尝试其他的可能路径,直至找到问题的解或证明问题无解。具体来说: - **确定解空间**:首先定义问题的解空间,即所有可能的解决方案集合。 - **...
### 经典问题的回溯算法 #### 一、引言 在现实生活中,很多问题并不像数学问题那样可以通过公式直接解决,它们往往需要经历一系列复杂的步骤和多种可能性的探索才能找到答案。这类问题通常涉及一定的规则,而这些...
在JavaScript编程领域中,"回退的页面数"这一概念主要涉及到浏览器的历史记录管理。当用户在网页间浏览时,浏览器会记录用户的访问路径,这就是所谓的“历史记录”。JavaScript提供了与用户浏览历史交互的能力,允许...
vs环境下实现计算字符串的大小、字符串连接(两种方法)、字符串的比较、计算子串的数目、模板匹配,如str 传入字符ABCDE,arr 传入30124,则输出DABCE;单项循环链表实现数3退1 。以上均在VS下编程测试通过。
这个问题实际上是一个经典的数学问题,通常被称为“空瓶换酒”或者“可乐瓶问题”。它涉及到递归和优化策略的概念,对于计算机科学中的算法设计和分析有着一定的启示。在这个问题中,我们用20元钱购买可乐,每瓶1元...
1. **启动条件**:当开发部门认为代码修改完毕,达到复测标准(Open和Reopen的缺陷个数*缺陷级别≤50)时,可以申请送测。 2. **开发申请**:开发人员提出测试申请,直接跳至第6步。 3. **测试申请**:如果测试部门...
例如,假设我们有5个数`{1, 2, 3, 4, 5}`,初始状态是未排列的,递归函数会尝试各种可能性,如`[1, 2, 3, 4] + [5]`,然后是`[1, 2, 3, 5] + [4]`等,直到所有可能的排列都被生成并输出。 在实际代码中,我们还需要...
这是一个经典的数独问题的简化版本,有助于理解数组和逻辑控制。 1. **Java基础:** 九宫图的实现基于Java的基本语法,包括类、对象、变量、方法等。Java是一种面向对象的编程语言,因此,我们可能看到一个名为`...
通过优化激光束的耦合,如增加激光束在入口平面的跳数和保持横截面的长宽比小于1,可以减少退偏损耗。 具体到YAG晶体的性质,其[111]晶面是研究退偏损耗的重要方向。[111]方向是指晶体的一个特殊晶轴方向,对于YAG...
由于15=3*5,我们优先选择3的倍数,然后是5的倍数,因为较大的数字可能会导致更大的组合数。 例如,如果字符串为"1234567890",我们会先尝试90(30的倍数),接着是60(3的倍数但不是5的倍数),最后是15(15的倍数...
17.有n个人围成一个圈子,从第一个人开始报数,报到3的退下,问最后留下的是编号为几的人; 18.字符串排序; 19.海滩上有一堆桃子,五只猴子来分,第一只猴子均分成5份,多出一个,扔进海里,自己拿走一份,第二三四...
除了基本的切削直径控制,还引入了加工余量(#2, #3)、每层切削后的回退量(#4)等概念,使得粗加工和精加工得以区分。通过条件判断语句(IF...GOTO),程序能够在满足特定条件时继续执行循环,否则跳过循环进入下一...
14. 题目14是“伞数”的问题,从1,2,3,4,5,6中任取3个数字组成无重复的三位数,使得中间的数字最大,共有C(3,1) * C(2,1) * C(3,1) = 18种方法,但由于题目要求的是“伞数”,即十位数字大于个位和百位,所以需减去...
对于排列数问题,我们可以创建一个二维数组dp[n+1][r+1],其中dp[i][j]表示从i个元素中取j个元素的排列数,然后根据递推关系填充这个表。 总的来说,排列数是数学和计算机科学中不可或缺的概念,它帮助我们理解和...