上网看了很多解决该问题的思路是面向过程的,用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、在类中定义一个链表...
这个是用JAVA实现的数三退一的源代码,是用双链表实现的,不知道对大家有没有用,可以看看,对于大学里老师可能会让人做这样的题目,可能看对大家有帮助哦
vs环境下实现计算字符串的大小、字符串连接(两种方法)、字符串的比较、计算子串的数目、模板匹配,如str 传入字符ABCDE,arr 传入30124,则输出DABCE;单项循环链表实现数3退1 。以上均在VS下编程测试通过。
17.有n个人围成一个圈子,从第一个人开始报数,报到3的退下,问最后留下的是编号为几的人; 18.字符串排序; 19.海滩上有一堆桃子,五只猴子来分,第一只猴子均分成5份,多出一个,扔进海里,自己拿走一份,第二三四...
实现提示:西瓜类中,设计3个数据成员(重量weight、总重量total_weiht、总个数 total_number)。因为不论西瓜是否存在,总重量total_weiht和总个数total_number这 两个数据总是要保留的,因此这两个数据要申明为...
(1)设自动售货机能销售3种商品,矿泉水、热狗和汉堡,它们的单价分别是1元、4元和8元。(2)自动售货机允许投入1元、2元和5元纸币。(3)购买商品时,首先按下要购买商品额对应按键,商品对应的灯亮。然后投入钱币...
设计一个简易的自动售货机,它能够完成钱数处理、找零、显示、退币等功能。 (1)用3个键表示3种钱,再用3个键表示3种物品。 (2)用2个数码管显示输入的钱数,再用2个数码管显示所找的钱数,以元为单位。 (3)买...
新的发展解决了一系列基础问题,如纠错问题、量子密码及有关的量子非克隆定理、量子远程传态、退相干的避免或减小等问题。新的算法也不断涌现。量子信息学的进一步发展大大丰富了量子力学纠缠态的理论,使量子信息可...
2010年全国研究生考试计算机统考真题一、单选题 ...5、在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶节点个数是() A:41 B:82 C:113 D:122
1.3即中即退选择~按键退币,按键退彩票,即中即退币,即中即退彩票 1.4机型选择:立式3人,立式四人,卧式4.6.8.10人 1.5加炮幅度:1~9900~建议10 1.6最小炮数:1~9900建议10=1毛钱 1.7最大炮数:50~9900建议1000分=10元 5000...
1.读入字符/数字--〉字符/数字进栈 2.根据算符优先级,退出两个字符/数字,用运算符计算结果,并将结果进栈 3.栈能刚好退完,则最后的即为结果。否则表明表达式求值的程序有误。
1. 实现贪心局部搜索、随机局部搜索、侧向移动局部搜索算法、模拟退 火算法。 第一章 局部搜索-八皇后问题 8 2. 统计上述算法在八皇后问题上成功求解的次数,成功求解时的平均迭 代步数,进行比较分析。 3. 绘制并...
3、加深对二叉树的理解,逐步培养解决实际问题的编程能力 一)基础题 1、编写二叉排序树的基本操作函数 (1)SearchNode( TREE *tree, int key,TREE **pkpt,TREE **kpt ) 查找结点函数; (2)InsertNode( TREE ...
为一家热狗食品公司设计一个自动出售热狗的系统,使其能在购物中心提供售卖服务。项目要求: 1. 运用传感器模拟投币信号,并将信号...3. 实现自动扣费,并能退付相应金额。 4. 交易完成后,数字系统能自动复位清零。
同时将操作数栈opnd退栈两次,得到两个操作数b、a,对a、b进行ab运算后,将运算结果作为中间结果推入opnd栈。 c.若栈顶运算符的优先级与刚读入的运算符c相同,说明左右括号相遇,只需将栈顶运算符(左括号)退栈...
1.录音;2.播放与停止;3.播放选择;4.快进快退;5.删除;6.显示相关信息。 当接通电源后,需要按下自锁开关才能使系统上电,随即LCD1602会显示录音条目选择界面。 按键开关从左至右(S0-S4)功能分别为S0-...
1、 读取并保存SD卡所有的MP3文件和LRC歌词文件,解析LRC文件读取歌词内容; 2、 在歌曲列表中显示歌曲名字,歌手名字,歌手头像; 3、 歌手的头像是我自己网上下载的几十位比较出名的歌手头像; 4、 在播放页面,最...