首页 > 编程语言 >2020-8-9-JAVA机考题

2020-8-9-JAVA机考题

时间:2024-03-22 17:11:51浏览次数:30  
标签:node JAVA void 考题 2020 new message public 日志

二叉排序数及中序遍历实现,socket应用,日志模拟的实现

试题一

/**
 * 实现要求:
 * 1、根据已有的代码片段,实现一个二叉排序树;
 * 2、用中序遍历输出排序结果,结果形如:0,1,2 ,3 ,4, 5, 6, 7, 8, 9,
 * 3、注意编写代码注释
 */

public class BinaryTree {

	public static void main(String[] args) {
		
		final int[] values = { 1, 3, 4, 5, 2, 8, 6, 7, 9, 0 };
		// TODO:
	}

	public static Node createBinaryTree(Node node, int value) {
		// TODO:
	}

	public static void inOrderTransval(Node node) {
		// TODO:
	}
}

class Node {

 	// 节点值
	private int value;

 	// 左节点
	private Node left;

	// 右节点
	private Node right;

	// TODO:
}

答案

public class BinaryTree {

    public static void main(String[] args) {

        final int[] values = { 1, 3, 4, 5, 2, 8, 6, 7, 9, 0 };
        // TODO:
        //创建根节点
        Node root=new Node(values[0]);

        //将数组中的数追加到根节点下
        for (int i = 1; i <values.length ; i++) {
            createBinaryTree (root,values[i]);
        }

        //中序遍历根节点
        inOrderTransval (root);
    }

    public static Node createBinaryTree(Node node, int value) {
        // TODO:
        //为排序二叉树追加子节点
        /*
        @param node 传入的根节点对象
        @param value 需要插入到二叉树的值
        @return 返回插入二叉树后该值对应的节点对象
         */
        Node return_node=null;
        if (node.getValue ()>value){
            if(node.getLeft ()!=null){
                node=node.getLeft ();
                createBinaryTree (node,value);
            }else{
                Node node1=new Node(value);
                node.setLeft (node1);
                return_node=node1;
                return return_node;
            }
        }else{
            if(node.getRight ()!=null){
                node=node.getRight ();
                createBinaryTree (node,value);
            }else{
                Node node1=new Node(value);
                node.setRight (node1);
                return_node=node1;
                return return_node;
            }
        }

        return return_node;
    }

    public static void inOrderTransval(Node node) {
        // TODO:
        //中序遍历
        if(node==null){
            return;
        }
        BinaryTree.inOrderTransval (node.getLeft ());
        System.out.println (node.getValue ());
        BinaryTree.inOrderTransval (node.getRight ());
    }
}

class Node {

    // 节点值
    private int value;

    // 左节点
    private Node left;

    // 右节点
    private Node right;

    // TODO:
    //构造方法
    //getter和setter方法
    
    public Node(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }

    public Node getLeft() {
        return left;
    }

    public void setLeft(Node left) {
        this.left = left;
    }

    public Node getRight() {
        return right;
    }

    public void setRight(Node right) {
        this.right = right;
    }

}

试题二

/**
 * 实现要求:
 * 1、根据代码片段实现一个简单的SOCKET ECHO程序;
 * 2、接受到客户端连接后,服务端返回一个欢迎消息;
 * 3、接受到"bye"消息后, 服务端返回一个结束消息,并结束当前连接;
 * 4、支持通过telnet连接本服务端,并且可正常运行;
 * 5、注意代码注释书写。
 *
 */
public class EchoApplication {

	public static void main(String[] args) throws IOException, InterruptedException {

		final int listenPort = 12345;

		// 启动服务端
		EchoServer server = new EchoServer(listenPort);
		server.startService();

		// 启动客户端
		EchoClient client = new EchoClient(listenPort);
		client.startService();

		// 在控制台输入,服务端直接原文返回输入信息
		// 控制台结果示例:
		/**
			2020-03-31 16:58:44.049 - Welcome to My Echo Server.(from SERVER)
			
			Enter: hello!
			2020-03-31 16:58:55.452 - hello!(from SERVER)
			
			Enter: this is koal.
			2020-03-31 16:59:06.565 - this is koal.(from SERVER)
			
			Enter: what can i do for you?
			2020-03-31 16:59:12.828 - what can i do for you?(from SERVER)
			
			Enter: bye!
			2020-03-31 16:59:16.502 - Bye bye!(from SERVER)
		 */
	}

}

class EchoServer {
	// TODO
}

class EchoClient {
	// TODO
}

答案

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

public class EchoApplication {

    public static void main(String[] args) throws IOException, InterruptedException {

        final int listenPort = 12345;

        // 启动服务端
        EchoServer server = new EchoServer(listenPort);
        server.startService();

        // 启动客户端
        EchoClient client = new EchoClient(listenPort);
        client.startService();

    }

}

class EchoServer {
    // TODO
    ServerSocket ss=null;
    public EchoServer(int listenPort) throws IOException {
        //初始化服务端
        ss=new ServerSocket(listenPort);
    }

    public void startService(){

        //为服务端单独开启一个线程
        new Thread (()->{
            try {
                Socket s=ss.accept();//开始监听
                
                //向客户端发送问候
                s.getOutputStream ().write ("Welcome to My Echo Server.".getBytes ());
                
                byte[] message_from_client=new byte[1024];//缓冲数组
                
                while (true){
                    InputStream is=s.getInputStream();
                    OutputStream os=s.getOutputStream ();
                    int len=is.read (message_from_client);
                    if(len==-1){
                        break;
                    }
                    byte[] message_from_client_handled=Arrays.copyOfRange (message_from_client,0,len);
                    
                    //收到客户端发来关闭信息时,关闭服务端,并返回关闭成功信息
                    if(new String (message_from_client_handled).equals ("bye")){
                        os.write ("Bye bye!".getBytes ());
                        s.close ();
                        ss.close ();
                        break;
                    }
                    os.write (message_from_client_handled);

                }
            } catch (IOException e) {
                e.printStackTrace ( );
            }
        }).start ();
    }

}

class EchoClient {
    // TODO
    Socket s=null;
    public EchoClient(int listenPort) throws IOException {
        //初始化客户端
        s=new Socket("localhost",listenPort);
    }
    public void startService() throws IOException {
        OutputStream os=s.getOutputStream();//输出流
        InputStream is=s.getInputStream();//输入流

        byte[] message_from_server=new byte[1024];//缓冲数组
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //连接成功,打印服务端传过来的问候语
        int len=is.read (message_from_server);
        System.out.println (sdf.format (new Date ())+" - " +new String (Arrays.copyOfRange (message_from_server,0,len))+" (from server)");
        
        while (true){
            Scanner sc = new Scanner(System.in);
            byte[] to_server_msg=sc.nextLine ().getBytes ();
            os.write (to_server_msg);
            len=is.read (message_from_server);
            if(len==-1){
                break;
            }
            System.out.println (sdf.format (new Date ())+" -" +new String (Arrays.copyOfRange (message_from_server,0,len))+" (from server)");
            
            //确认收到服务端关闭信息,关闭客户端
            if(new String (Arrays.copyOfRange (message_from_server,0,len)).equals ("Bye bye!")){
                s.close ();
                break;
            }

        }

    }

}

试题三

/**
 * 实现要求:
 * 1、根据以下代码片段,参考log4j/slf4j等公共日志库编写一个自定义的简易日志类;
 * 2、至少需要支持文件输出、控制台输出二种日志输出方式,并支持同时输出到文件和控制台;
 * 3、支持DEBUG/INFO/WARN/ERROR四种日志级别;
 * 4、请合理进行设计模式,进行接口类、抽象类等设计,至少包括FileLogger、ConsoleLogger二个子实现类;
 * 5、注意代码注释书写。
 */

public class KLLogger {

	public static void main(String[] args) {

		final KLLogger logger1 = KLLogger.getLogger(KLLogger.class);

		// TODO:
		
		logger1.setLogLevel(DebugLevel.DEBUG);

		logger1.debug("debug 1...");
		logger1.debug("debug 2...");
		logger1.info("info 1...");
		logger1.warn("warn 1...");
		logger1.error("error 1...");

		final KLLogger logger2 = KLLogger.getLogger(KLLogger.class);
		logger2.setLogLevel(DebugLevel.INFO);

		logger2.debug("debug 1...");
		logger2.debug("debug 2...");
		logger2.info("info 1...");
		logger2.warn("warn 1...");
		logger2.error("error 1...");

	}
}

// TODO:
class XXX1 {
}

// TODO:
class XXX2 {
}

enum DebugLevel {
	DEBUG, INFO, WARN, ERROR;
}

答案

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class KLLogger {

    public static void main(String[] args) {

        final KLLogger logger1 = KLLogger.getLogger(KLLogger.class);

        // TODO:
        //记录DEBUG级别以上的日志
        logger1.setLogLevel(DebugLevel.DEBUG);

        logger1.debug("debug 1...");
        logger1.debug("debug 2...");
        logger1.info("info 1...");
        logger1.warn("warn 1...");
        logger1.error("error 1...");

        System.out.println ("---------------------------------------------");

        final KLLogger logger2 = KLLogger.getLogger(KLLogger.class);
        //记录INFO级别以上的日志
        logger2.setLogLevel(DebugLevel.INFO);

        logger2.debug("debug 1...");
        logger2.debug("debug 2...");
        logger2.info("info 1...");
        logger2.warn("warn 1...");
        logger2.error("error 1...");

    }

    //将要进行日志记录的类
    private Class cls;

    //日志级别
    private Enum loglevel;

    //文件日志记录器
    static private Appender fileLogger=new FileLogger ();

    //控制台日志记录器
    static private Appender consoleLogger=new ConsoleLogger ();

    //文件日志输出路径
    public static String log_out_put_dir="D:\\log.txt";

    //时间格式化对象
    private SimpleDateFormat simpleDateFormat=new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");

    //构造方法,将要进行日志记录的类传入
    public KLLogger(Class cls) {
        this.cls=cls;
    }

    //日志对象的构建方法
    public static KLLogger getLogger(Class cls){
        return new KLLogger (cls);
    }

    //设置日志记录级别
    public void setLogLevel(Enum e){
        this.loglevel=e;
    }

    //生成debug类型日志
    public void debug(String message){
        if(this.loglevel.equals (DebugLevel.INFO) | this.loglevel.equals (DebugLevel.WARN) | this.loglevel.equals (DebugLevel.ERROR)){
            return;
        }
        consoleLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
        fileLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
    }

    //生成info类型日志
    public void info(String message){
        if(this.loglevel.equals (DebugLevel.WARN) | this.loglevel.equals (DebugLevel.ERROR)){
            return;
        }
        consoleLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
        fileLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
    }

    //生成warn类型日志
    public void warn(String message){
        if(this.loglevel.equals (DebugLevel.ERROR)){
            return;
        }
        consoleLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
        fileLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
    }

    //生成error类型日志
    public void error(String message){
        consoleLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
        fileLogger.doAppend (this.cls,message,simpleDateFormat.format (new Date ()));
    }
}

// TODO:
//文件中记录日志
class FileLogger implements Appender {
    FileWriter fileWriter= null;
    @Override
    public void doAppend(Class cls,String message,String time){
        try {
            //将日志写入到文件
            FileWriter fw=getFileWriter ();
            fw.append (time+" "+cls.getName ()+" "+message+System.getProperty("line.separator", "\n"));
            fw.flush ();
        } catch (IOException e) {
            e.printStackTrace ( );
        }
    }
    //获取FileWriter(单例)
    private FileWriter getFileWriter(){
        if(fileWriter==null){
            try {
                File file=new File (KLLogger.log_out_put_dir);
                //判断文件是否存在,如果不存在则重新创建
                if(!file.exists ()){
                    file.createNewFile ();
                }
                fileWriter = new FileWriter (file,true);
            } catch (IOException e) {
                e.printStackTrace ( );
            }
        }
        return fileWriter;
    }
}

// TODO:
//控制台打印日志
class ConsoleLogger implements Appender {
    @Override
    public void doAppend(Class cls,String message,String time) {
        System.out.println (time+" "+cls.getName ()+" "+message );
    }
}

//日志输出接口
/*
@Param cls 调用日志的类的class
@Param message 日志信息
@Param time 当前时间
 */
abstract interface Appender{
    void doAppend(Class cls,String message,String time);
}
enum DebugLevel {
    DEBUG, INFO, WARN, ERROR;
}

标签:node,JAVA,void,考题,2020,new,message,public,日志
From: https://www.cnblogs.com/sylvesterzhang/p/18089868

相关文章

  • 2020-8-6-JVM虚拟机
    运行时数据区域、溢出、垃圾收集、问题解决运行时数据区域Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域1)程序计数器(1)一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器(2)字节码解释器工作时就是通过改变这个计数器的......
  • 2020-8-12-Spring-Security
    资源访问控制方式、认证流程、授权流程、快速开始、授权案例、自定义登陆登出页面、会话管理、基于方法的授权资源访问控制方式基于角色的访问控制Role-BasedAccessControl基于资源的访问控制(常用)Resource-BasedAccessControl认证流程UsernamePasswordAuthenticatio......
  • 2020-2-11-Angular
    Amgular安装、插件安装、新建组件、组件编写、双向绑定、服务、ViewChild、组件间通信、声明周期函数、异步编程、路由、模块化实现懒加载安装npminstall-g@angular/cli查看版本ngv创建项目//在filedir中创建项目,并安装依赖ngnewfiledir//在filedir中创建项目,......
  • 2020-1-31-Typescript基础知识
    typescript安装、编译、数据类型、函数声明、ES5中的类、TS中的类、接口、泛型、装饰器Typescript安装npminstalll-gtypescript编译成jstscaaa.ts执行该命令后会自动生成js文件在VScode中设置保存后自动编译1.生成tscconfig.json文件tsc--init2.修改tscconfig.......
  • 2020-2-17-mongodb的使用
    下载地址、安装、启动服务、查看、创建数据库及表、新增数据、删除数据、更新数据、查询数据、索引下载地址http://dl.mongodb.org/dl/win32/x86_64下载名为mongodb-win32-x86_64-2012plus-v4.2-latest-signed.msi的文件安装点击下一步,跳过安装mangodb_compass启动服务mo......
  • 2020-3-1-jsonp原理
    原理ajax请求受同源策略影响,不允许进行跨域请求,而script标签src属性中的链接却可以访问跨域的js脚本,利用这个特性,服务端不再返回JSON格式的数据,而是返回一段调用某个函数的js代码,将数据作为参数,在src中进行了调用,这样实现了跨域。实现代码1服务端//nodejsvarhttp=require......
  • 2020-2-26-koa框架使用
    快速上手、路由、动态路由、获取get值、中间间、koa-views使用、ejs小结、利用中间体配置公共变量、获取post数据、静态web服务、koa-art-template使用、cookies使用、session使用、mongodb数据库封装、路由模块化案例、快速创建koa项目koa-generator快速上手1安装npminstall......
  • 2020-2-20-nodejs基础知识
    vs插件安装、快速运行、url模块使用、自动重启工具supervisor、自定义模块、下载第三方包、fs模块、Async、Await的使用、文件里、简易静态服务器、事件驱动EventEmitter、模拟登陆简单版、模拟express封装、操作mongodb数据库VScode插件安装需要安装NodeSnippets插件才会有提......
  • 2020-3-7-webpack打包工具
    概述、快速使用、配置文件、webpack-dev-server、babel使用概述为优化页面发送多次的二次请求导致加载速度变慢和处理错综复杂的文件依赖关系,则需要将项目中涉及的多个文件进行合并并重新构建。wepack是一个基于node.js项目构建工具,其构建方式是基于项目构建。安装npmiwebp......
  • 2020-5-11-Mybatis
    框架和架构、MyBatis概述、入门、增删改查操作、dao实现类增删改查、引用外部配置文件、配置实体类别名、注册指定包内的dao接口、动态sql、一对多查询、多对多查询、延迟加载、mybatis缓存、注解开发框架和架构1框架软件开发的一套解决方案,不同框架解决不同问题。框架中封装很......