Java-数据结构与算法-逢3减1-面向对象

1.要求:有一群人围成一圈数数,逢3退1人,要求算出最后留下来的人的下标
2.用面向对象思想,有三个步骤:
(1)有哪些类:找名词--"有一群人围成一圈",所以有类People,PeopleCircle

(2)有哪些属性方法

(3)类的关系

3.代码:

  1 package Test;
  2
  3 public class Count3Quit1$2 {
  4
  5     public static void main(String[] args) {
  6         PeopleCircle pc = new PeopleCircle(500);
  7         int countNum = 0;
  8
  9         People del = pc.getLast(); //先把位置指向last,一开始计数就会指向第一个元素
 10         while(pc.getCount() > 1){
 11             countNum++;
 12             del = del.getRight();//跟踪当前的元素位置,且到了末尾会自动从头开始跟踪
 13             if(countNum == 3){
 14                 pc.delete(del);
 15                 countNum = 0;
 16             }
 17         }
 18         System.out.println(pc.getCount());
 19         System.out.println(pc.getFirst());
 20         System.out.println(pc.getLast());
 21     }
 22
 23 }
 24
 25 //要求:有一群人围成一圈数数,逢3退1人,要求算出最后留下来的人的下标
 26 //用面向对象思想,有三个步骤:
 27 //(1)有哪些类(2)有哪些属性方法(3)类的关系
 28
 29 //(1)有哪些类?找名词--"有一群人围成一圈",所以有类People,PeopleCircle
 30 class People{
 31
 32     private int id;
 33     private People left;
 34     private People right;
 35
 36     public People(int id) {
 37         super();
 38         this.id = id;
 39     }
 40
 41     public People getLeft() {
 42         return left;
 43     }
 44
 45     public void setLeft(People left) {
 46         this.left = left;
 47     }
 48
 49     public People getRight() {
 50         return right;
 51     }
 52
 53     public void setRight(People right) {
 54         this.right = right;
 55     }
 56
 57     @Override
 58     public String toString() {
 59         return "People-"+id;
 60     }
 61 }
 62
 63 class PeopleCircle{
 64
 65     private int count = 0;
 66
 67     public int getCount() {
 68         return count;
 69     }
 70
 71     public PeopleCircle(int count) {
 72         for(int i = 0; i < count ; i++){
 73             add();
 74         }
 75     }
 76
 77     private People first;
 78     public People getFirst() {
 79         return first;
 80     }
 81
 82     private People last;
 83
 84     public People getLast() {
 85         return last;
 86     }
 87
 88     public void add(){
 89         People p = new People(count);
 90         if(count <= 0 ){
 91             p.setLeft(p);
 92             p.setRight(p);
 93             first = p;
 94             last = p;
 95             count++;
 96         }else {
 97             last.setRight(p);
 98             p.setLeft(last);
 99             p.setRight(first);
100             first.setLeft(p);
101             last = p;
102             count++;
103         }
104     }
105
106     public void delete(People p){
107         if(count <= 0){
108             System.out.println("已经没有人!");
109             return;
110         }else if(count == 1){
111             first = last = null;
112             count--;
113         }else{
114             p.getLeft().setRight(p.getRight());
115             p.getRight().setLeft(p.getLeft());
116
117             if(p == first){
118                 first = p.getRight();
119             }else if (p == last){
120                 last = p.getLeft();
121             }
122             count--;
123         }
124     }
125 }

4.运行结果:

时间: 2024-10-20 12:51:46

Java-数据结构与算法-逢3减1-面向对象的相关文章

Java数据结构和算法(二)——数组

数组的用处是什么呢?--当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用.数组可以进行插入,删除,查找等. 1)创建和内存分配 Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符. int array[] = new int[10]; 既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) -- 一切都是

java数据结构与算法之顺序表与链表深入分析

转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52953190 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 ??数据结构与算法这门学科虽然在大学期间就已学习过了,但是到现在确实也忘了不少,因此最近又重新看了本书-<数据结构与算法分析>加上之前看的<java数据结构>也算是对数据结构的进一步深入学习了,于是也就打算

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

Java数据结构和算法之递归

四.递归 递归是函数调用自身的一种特殊的编程技术,其应用主要在以下几个方面:   阶乘 在java当中的基本形式是: Public  void  mothed(int n){//当满足某条件时: Mothed(n‐1): } 递归二分查找 Java二分查找实现,欢迎大家提出交流意见.  /** *名称:BinarySearch *功能:实现了折半查找(二分查找)的递归和非递归算法. *说明: *     1.要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integ

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之栈与队列

二.栈与队列 1.栈的定义 栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表. (1)通常称插入.删除的这一端为栈顶(Top),另一端称为栈底(Bottom). (2)当表中没有元素时称为空栈. (3)栈为后进先出(Last In First Out)的线性表,简称为LIFO表. 栈的修改是按后进先出的原则进行. 每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除. 图1 [示例]元素是以a1,a2,-,a

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

Java数据结构和算法之哈希表

五.哈希表 一般的线性表.树中,记录在结构中的相对位置是随机的即和记录的关键字之间不存在确定的关系,在结构中查找记录时需进行一系列和关键字的比较.这一类查找方法建立在"比较"的基础上,查找的效率与比较次数密切相关.理想的情况是能直接找到需要的记录,因此必须在记录的存储位置和它的关键字之间建立一确定的对应关系f,使每个关键字和结构中一个唯一的存储位置相对应.因而查找时,只需根据这个对应关系f找到给定值K的像f(K).若结构中存在关键字和K相等的记录,则必定在f(K)的存储位置上,由此不需

Java数据结构和算法(一)——开篇

这篇文章里面不讲技术,抽空讲讲技术和通俗之间有一种奇特的关系,还有驱动力学习的东西. 1)技术与通俗 大学里面那本严蔚敏的数据结构不厚,内容丰富,但是复杂问题的讲解方面篇幅这样就少了,比较难理解,c也不是很擅长,但是基本的思路还是有的. 简单的链表,数组,堆栈,队列,图,几个排序算法. 后面看到知乎涛吴的回答,当时很震撼,这里引用一下他的回答: 如果说 Java 是自动档轿车,C 就是手动档吉普.数据结构呢?是变速箱的工作原理.你完全可以不知道变速箱怎样工作,就把自动档的车子从 A 开到 B,而