java算法之数三退1
java算法之数3退1
该题是尚学堂马世兵老师经讲过的一道题,题目是这样的:
一群小孩围成一个圈,其中一个小孩从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