2020-11-17

21 篇文章 0 订阅

11/17
这是今天的几道面试题
1.什么是IO流
它是一种数据的流,从源头流到目的地。比如文件拷贝,输入流和输出流都包括了。输入流从文件中
读取数据存储到进程中,输出流从进程中读取数据然后写入到目标文件中。

2.字节流和字符流的区别
字节流是以字节为单位写入写出,字符流是以字符为单位写入写出的

3.java中流类的超类主要是哪些
java.io.InputStream
java.io.OutputStream
java.io.Reader
java.io.Writer

4.BufferedInputStream的优势
如果input使用的是read()方法,每次读取都要访问一次硬盘,这种读取方式效率很低。
如果通过bufferded来读取,这个方法一开始会初始化一个比较大的字节数组,一次性从底层读取很多字节来填充
数组,但程序读取一个或者多个字节的时候,可以直接从字节数组中获取,当内存中的byte读取完之后,会再次
从底层输入流填充字节数组。

5.BIO、NIO、AIO、信号驱动IO、IO多路复用

BIO
NIO
IO多路复用:请求到来的时候,调用select pool epoll函数,让操作系统自己去轮询数据

6.信号区别
io:当网络套接字刻度后,内核会通过发送sigio信号来通知应用进程
aio:aio这边就程序一调用read就离开返回,然后写好回调函数,或者返回future,两种方式回调式和将来式,
io两个步骤都是内核去完成和用户线程没有关系,内核完成之后通知用户线程,这意味着AIO两个步骤都能做自己的事情

7.IO多路复用实现
select
创建一个fd_set(bitmap),放入内核空间中,内核监听多个描述符,将fd_set返回给对应用户,用户遍历fd_set

存在的问题:

  1. 内置数组的形式使得select的接受的最多请求数受限于FD_SetSIZE(bitmap结构),1024大小;
  2. 每次调用select前都要重新初始化fd_set,将fd_set从用户空间拷贝到内核态
  3. 每次调用select后,都需要将fd从内核态拷贝到用户态;
  4. 轮寻排查当文件描述符个数很多时,效率很低;

poll

通过使用数组替代fd_set,并且数组可宠用,轮寻排查和传入内核的问题未解决。

epoll

使用红黑树代替fdset,有数据后重排结构。

红黑树在用户和内核的共享空间上。

8.blockingio和io多路复用的区别
如果BIO要能够同时处理多个客户端请求,即为每一个客户端连接请求都创建一个线程来单独处理。

只需要开启一个线程就可以处理来自多个客户端的连接请求和io请求。

9.java nio
核心部件:channel:双向通道,可读也可写
buffer:缓冲区,读取数据时,直接读到缓冲区中,写入数据时也是写入缓冲区
selector:选择器,用于单个线程处理多个通道

今天算法上还是做的动态规划,动态规划怎么说呢,今天做的题目都是要自己去找其中题目的数学关系,找不到就很难做,啊这。。。
这里写一道经典例题
198. 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

示例 1:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 + 3 = 4 。

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 + 9 + 1 = 12 。

class Solution {
    public int rob(int[] nums) {
        int len=nums.length;
        if(len==0){
            return 0;
        }
        if(len==1){
            return nums[0];
        }
        int[][] dp=new int[len][2];
        dp[0][0]=0;
        dp[0][1]=nums[0];
        for(int i=1;i<len;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]);
            dp[i][1]=dp[i-1][0]+nums[i];
        }
        return Math.max(dp[len-1][0],dp[len-1][1]);
    }
}

这里使用了二维数组,其中0和1表示抢不抢这间房屋,用了dp数组来自底向上计算题目的要求,当不抢的时候,为0然后是前一个不抢dp【i-1】【0】和抢dp【i-1】【1】的最大值,至于如果抢的话,计算思路也更简单了,也就是前一个不抢的时候dp【i-1】【0】加上当前的房屋所有的钱nums【i】
还有其他的几道动态规划,真的感觉自己脑子不够用了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值