2020-10-26刷题

斐波那契数列

第一种方法递归

public class Solution {
    public int Fibonacci(int n) {
        if(n==0 || n==1){
            return n;
        }
        return Fibonacci(n-1)+Fibonacci(n-2);
    }
}

第二种方法迭代代替递归

public class Solution {
    public int Fibonacci(int n) {
        int result=0;
        int pre_1=1;
        int pre_2=1;
        if(n==1 || n==2){
            return 1;
        }
        for(int i=2;i<n;i++){
            result=pre_1+pre_2;
            pre_1=pre_2;
            pre_2=result;
        }
        return result;
    }
}

二叉树的层序遍历

  1. 因为ide里面没有输入序列直接构造树的函数,所以写了一个constructTree的方法平时可以测试用
  2. 注意实现层序遍历的时候,中间利用的是一个队列来实现每一层节点的存储,而不是栈,因为节点需要先进先出,并用一个临时变量size来记录每一层的数量,这样就不需要使用两个队列了
  3. java里面可以用stack类直接实现栈,队列的实现用的不是queue,而是用linkedlist来实现哦
import java.util.*;

public class Solution {

    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
        public TreeNode(){

        }

        public TreeNode(int val){
            this.val=val;

        }
    }

    /**
     * 构造一棵树
      * @param nums
     * @return
     */
    public  TreeNode constructTree(Integer[] nums){
        if (nums.length == 0) return new TreeNode(0);
        Deque<TreeNode> nodeQueue = new LinkedList<>();
        // 创建一个根节点
        TreeNode root = new TreeNode(nums[0]);
        nodeQueue.offer(root);
        TreeNode cur;
        // 记录当前行节点的数量(注意不一定是2的幂,而是上一行中非空节点的数量乘2)
        int lineNodeNum = 2;
        // 记录当前行中数字在数组中的开始位置
        int startIndex = 1;
        // 记录数组中剩余的元素的数量
        int restLength = nums.length - 1;

        while(restLength > 0) {
            // 只有最后一行可以不满,其余行必须是满的
//            // 若输入的数组的数量是错误的,直接跳出程序
//            if (restLength < lineNodeNum) {
//                System.out.println("Wrong Input!");
//                return new TreeNode(0);
//            }
            for (int i = startIndex; i < startIndex + lineNodeNum; i = i + 2) {
                // 说明已经将nums中的数字用完,此时应停止遍历,并可以直接返回root
                if (i == nums.length) return root;
                cur = nodeQueue.poll();
                if (nums[i] != null) {
                    cur.left = new TreeNode(nums[i]);
                    nodeQueue.offer(cur.left);
                }
                // 同上,说明已经将nums中的数字用完,此时应停止遍历,并可以直接返回root
                if (i + 1 == nums.length) return root;
                if (nums[i + 1] != null) {
                    cur.right = new TreeNode(nums[i + 1]);
                    nodeQueue.offer(cur.right);
                }
            }
            startIndex += lineNodeNum;
            restLength -= lineNodeNum;
            lineNodeNum = nodeQueue.size() * 2;
        }

        return root;
    }



    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> result=new ArrayList<>();
        if(root==null){
            return result;
        }

        LinkedList<TreeNode> queue=new LinkedList<>();
        queue.offer(root);

        while(!queue.isEmpty()){
            int size=queue.size();
            ArrayList<Integer> list=new ArrayList<>();

            while(size>0){
                size--;
                TreeNode node=queue.poll();
                System.out.println(node.val);
                list.add(node.val);
                if(node.left!=null) queue.offer(node.left);
                if(node.right!=null) queue.offer(node.right);
            }
            result.add(list);
        }
        return result;
    }

    public static void main(String[] args) {
        Integer[] nums = {5,4,8,11,null,13,4,7,2,null,null,null,1};
        Solution solution=new Solution();
        TreeNode root = solution.constructTree(nums);

        ArrayList<ArrayList<Integer>> result=solution.levelOrder(root);
        System.out.println(result);


    }

}

设计模式-单例模式

昨天学习了使用接口和类的组合,来实现一个策略模式
还是接着昨天游戏的例子来看,如何实现一个单例模式(即一个类有且只能有一个实例)
需求:因为游戏里面的水晶和基地是唯一的
所以:需要用到单例模式
下面写一个代码来完成多个英雄来攻击同一个水晶

  • 首先針對基地,我們創造一個單利類,注意里面需要写一个公共的静态的同步的创建对象的方法
/**
 * 基地(单例类)
 */

public class Base {
//    构造方法需要是私有的
    private Base(){}
//    创建一个私有的,静态的,基地对象的引用
    private static Base base=null;
//    提供一个公共的静态的创建基地对象或获取基地对象的方法
//    多个英雄中只有一个英雄能够获取基地所以我们需要使用[同步]的方法
    public synchronized static Base getBase(){
        if(base==null){
            base=new Base();
        }
        return base;
    }
//    基地的生命值
    private int life=999;
//    基地的摧毁状态,默认是没有摧毁的
    private boolean destroy=false;

    public int getLife() {
        return life;
    }

    public void setLife(int life) {
        this.life = life;
    }

    public boolean isDestroy() {
        return destroy;
    }

    public void setDestroy(boolean destroy) {
        this.destroy = destroy;
    }
}
  • 如下所示,注意在实例化单例类的时候,我们不使用new,而是使用之前写到的公共的静态的同步的创建对象的方法
import java.util.BitSet;

/**
 * 测试
 */

public class BaseTest {
    public static void main(String[] args){
        System.out.println("英雄集合攻击基地");
        //    模拟两个英雄,攻击基地
        new Thread(new Runnable() {
            @Override
            public void run() {
//                创建英雄[后裔],设置英雄单次攻击伤害值
                Hero hero=new Houyi();
                hero.setHeroHurt(100);//攻击力100

//                获取基地,英雄攻击基地
//          因为构造方法私有化了,所以不能这样new了      Base base=new Base();
//                而需要使用getbase得到唯一的一个基地实例,我们就把这种模式称为单例模式
                Base base=Base.getBase();
                destroyBase(hero,base);
            }


        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
//                创建英雄[鲁班七号],设置英雄单次攻击伤害值
                Hero hero=new LuBanQiHao();
                hero.setHeroHurt(80);//攻击力80

//                获取基地,英雄攻击基地
//          因为构造方法私有化了,所以不能这样new了      Base base=new Base();
//                而需要使用getbase得到唯一的一个基地实例,我们就把这种模式称为单例模式
                Base base=Base.getBase();
                destroyBase(hero,base);
            }


        }).start();
    }
//    英雄摧毁基地的方法
    private static void destroyBase(Hero hero, Base base) {
        //1.显示是哪个英雄在攻击,伤害是多少
        System.out.println("英雄"+hero.getHeroname()+"伤害值"+hero.getHeroHurt());

//        2.攻击基地
//        判断基地生命值>0,若生命值>0,英雄持续攻击
        while(base.getLife()>0) {
            //为了让基地一段时间内只能被一个英雄摧毁,我们需要添加一个同步

            synchronized (base){
                //写了synchronized,这个大括号里面的代码,一次只能被一个线程使用
                if(!base.isDestroy()){
//                没有被摧毁
                    //攻击基地,基地的剩余生命值减少
                    //基地的剩余生命值=当前生命值-攻击力

                    base.setLife(base.getLife()-hero.getHeroHurt());

                    //模拟攻击基地的耗时操作
                    try{
                        Thread.sleep(500);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    };
                    //        若没有被摧毁
                    //判断基地生命值>0,若生命值>0,英雄攻击
                    if(base.getLife()>0){
                        System.out.println("英雄"+hero.getHeroname()+"剩余生命值"+base.getLife());
                    }else{
                        //基地生命值<=0,说明基地已被摧毁,更新状态为摧毁,游戏胜利
                        base.setDestroy(true);
                        System.out.println("基地已被["+hero.getHeroname()+"]摧毁,游戏胜利");
                    }
                }
            }
//        2.1判断当前基地的状态是否已被摧毁

        }



    }
}

abstract object & interface

面试经常问到的问题,接口和抽象类的区别是什么呢?

我们先了解一下抽象类

  • 抽象方法所在的类,必须是抽象类才行,抽象类里面也可以有普通的成员方法

  • 如何使用抽象类和抽象方法呢?这个过程参见昨天写hero和houyi,不再赘述了
    1.首先,不能直接new一个抽象类的对象
    2.必须用一个子类来继承抽象类
    3.子类必须覆盖重写抽象父类当中[所有]的抽象方法
    4.创建(new)一个子类对象进行使用,运行的就是子类里面的方法了

  • 抽象类和方法的注意事项

1.抽象类不能创建对象
2.抽象类中,可以有构造方法,抽象父类的构造方法在子类的构造方法之前执行,new一个子类的时候,父类的构造方法仍然是要执行的
3.一个抽象类中,不一定包含抽象方法
4.子类仍然可以是抽象类,比如动物(抽象类)->狗(抽象类)->博美(可实例化)

然后讲一下接口

接口就是一种公共的规范标准,接口是一种引用数据类型,最重要的内容就是其中的抽象方法

  • 换成了关键字interface之后,编译生成的字节码文件仍然是.java—>.class
  • 接口的构成
    java7,接口中包含常量,抽象abstra方法
    java8,额外包含默认defaul方法,静态static方法
    java9,额外包含私有private方法

抽象方法的格式:public abstract 返回值类型 方法名称(参数列表);(没有大括号也就是方法体,且必须是public和abstract不能是其他的,如果不写的话,默认就是public abstract的)

  • 接口使用步骤
    1.接口不能直接使用,必须有一个"实现类"来实现该接口,可以类比extends
    2.接口的实现类必须覆盖重写接口中所有的抽象方法
    3.创建实现类的对象,进行使用
    可以看到implements和继承的规定来说是差不多的

默认方法的格式:public default 返回值类型 方法名称(参数列表){方法体};接口当中的默认方法可以解决接口的升级问题,默认方法也可以被覆盖重写

静态方法的格式:public static 返回类型 方法名称(参数列表){方法体};使用的时候通过接口名称直接调用其中的静态方法myInterface.methodstatic();

私有方法的格式:private 返回类型 方法名称(参数列表){方法体};解决多个默认方法之间重复代码问题

接口当中也可以定义成员变量,但是必须使用public static final三个关键字进行修饰,从效果上看这就是接口的常量

明天

工厂模式/final
搞个小项目
哎,真不想去实验室,每天都在被老师pua,放嘲讽,不放嘲讽会死啊(白眼),快点毕业吧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值