• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

13

开发技术 开发技术 5小时前 2次浏览

作者:hhf09
链接:https://www.nowcoder.com/discuss/771091?type=post&order=create&pos=&page=0&ncTraceId=&channel=-1&source_id=search_post_nctrack
来源:牛客网

选择

操作系统

  • 虚拟存储器目的

实现存储保护,扩大内存的寻址空间

当发生缺页中断时,如果操作系统内存中没有空闲页面,则操作系统必须在内存选择一个页面将其移出内存,以便为即将调入的页面让出空间,而用来选择淘汰哪一页的规则叫做页面置换算法

并发(concurrency)和并行(parallellism)是:

  1. 解释一:并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  2. 解释二:并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
  3. 解释三:并行是在多台处理器上同时处理多个任务。如 hadoop 分布式集群,并发是在一台处理器上“同时”处理多个任务。

所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

网络

  • 同一子网的主机地址

数据库

  • 给一段描述,选择sql语句,主要考察group by, having

https://www.cnblogs.com/max1995/p/11766987.html

where, group by, having

数据结构与算法

  • 满二叉树的结点数计算

  • 深度优先搜索属于哪种算法(有贪心、动态规划、分治、回溯)

填空

  • 数组删除元素平均要移动多少次

https://blog.csdn.net/weixin_38233103/article/details/110595500

n/2

13

  • 给一段代码,计算时间复杂度

大题

  • TCP报文段的字段含义,有SYN, PSH, ACK, FIN

SYN:用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。注:捎带是指对客户机到服务器数据的确认被装载在一个承载服务器到客户机的数据

PSH:当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。

ACK:当ACK=0时,表示该数据段不包含确认信息,当ACK=1时,表示该报文段包括一个对已被成功接收报文段的确认。

FIN:用于释放一个连接,表示发送方已经没有数据要传输了。此时,接收方可能继续接收数据,好在SYN和FIN数据段都有序列号,从而保证了这两种数据段以正确顺序被处理

  • TCP流量控制,滑动窗口,根据图描述过程

https://baijiahao.baidu.com/s?id=1664395039305097355&wfr=spider&for=pc

https://www.cnblogs.com/xuelisheng/p/9387990.html

https://www.cnblogs.com/luoquan/p/4886345.html

https://blog.csdn.net/u013291818/article/details/72716478

13

  • 游戏有很多定时任务,每个任务有个有效时间,如果遍历所有任务查看是否过期,效率很低,编程设计一个任务定时器,个人感觉是TimerTask, Timer之类的,不过答题区域相当于记事本,纯手撕😔

https://blog.51cto.com/u_13294304/2953550

https://blog.csdn.net/wkh18891843165/article/details/115253515

import java.util.Date;
import java.util.concurrent.PriorityBlockingQueue;

//描述类(Timer)
class Timer implements Comparable<Timer> {
    //里面有两个属性,时间+任务
    long time;
    Runnable runnable;//任务就是Runnable类型的,因为它里面有自带run方法,更容易执行

    //赋初值
    public Timer(Runnable runnable, long after) {
        this.runnable = runnable;
        //这里的时间,我们就定义成多长时间之后去执行任务,也就是延迟时间 = 当前时间+要延迟的时间
        this.time = System.currentTimeMillis() + after;
    }

    //提供一个执行方法
    public void run() {
        runnable.run();
    }

    //优先级的排序方法
    @Override
    public int compareTo(Timer o) {
        return (int) (this.time - o.time);//正序.正序的好处:把最紧急的任务排在最前面
        //return (int)(o.time-this.time);//倒叙
    }
}

//组织类(Worker)
class Worker {
        //1.创建一个优先级队列,但是不是所有的任务都能够放进这个队列,所有我们就指定只能够存放我们Timer类里面的任务
        //2.既然是一个优先级队列,那么肯定有它的优先级,也就是重写Comparable里面的compareTo()方法
        PriorityBlockingQueue<Timer> priorityBlockingQueue = new PriorityBlockingQueue<>();

        //创建一个锁
        Object lock = new Object();

        //1.任务的扫描和执行
        //如何扫描,也就是当初始化Worker的时候就创建一个线程一直去扫描任务
        public Worker() {
            Thread thread = new Thread(() -> {
                while (true) {
                    //1.扫描任务,首先得要有一个容器去放任务,那就是得有优先级阻塞队列
                    try {
                        //2.获取到队首的任务,而且只要扫描到第一个任务就可以得到整个队列的(任务)检查
                        Timer timer = priorityBlockingQueue.take();
                        //当拿到任务之后就判断拿到任务的时间是否小于当前时间,如果小于,那么说明这个任务达到了当前时间,可以执行
                        if (timer.time <= System.currentTimeMillis()) {
                            //然后调用run方法执行该任务
                            timer.run();
                        } else {
                            //假如拿到的是不具备执行的任务 那就将这个任务再放进阻塞队列
                            priorityBlockingQueue.put(timer);
                            System.out.println("不具备执行条件");
                            //存在问题:如果它不具备执行条件,但是他还是会一直扫描
                            //解决方法:如果他不具备执行条件,那么就让它等着,知道被唤醒
                            synchronized (lock){
                                //那么等待多久呢?就是等待时间= 任务的时间-当前时间
                                lock.wait(timer.time - System.currentTimeMillis());
                            }

                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }


        //首先必须有任务,所以要写一个添加任务的方法,里面要传入任务和执行时间
        public void schedule(Runnable runnable, long after) {
            priorityBlockingQueue.put(new Timer(runnable, after));
            synchronized (lock){
                lock.notify();
            }
        }
    }

    public class ThreadDemo32 {
        public static void main(String[] args) {
            //创建定时器
            Worker worker = new Worker();
            //创建一个任务
            Runnable runnable = new Runnable() {
                @Override
                public void run() {
                    //如果要执行一个循环的延迟任务
                    worker.schedule(this,3*1000);
                    System.out.println("执行任务的时间:"+new Date());
                }
            };
            //查看添加任务的时间
            System.out.println("添加任务的时间:"+new Date());
            //添加一个任务,然后间隔3秒
            worker.schedule(runnable,3*1000);
        }
    }

作者:Leego0612
链接:https://www.nowcoder.com/discuss/772470?type=all&order=time&pos=&page=0&ncTraceId=&channel=-1&source_id=search_all_nctrack
来源:牛客网

8道不定项选择题

  • 简单的位运算,只考了与、或、异或

  • 程序阅读题

  • HTTP协议的特点

https://www.cnblogs.com/xuxinstyle/p/9813654.html

五大特点:1、支持客户/服务器模式;2、简单快速;3、灵活;4、无连接;5、无状态

  • Java语法规范、规则
  • 栈的出入栈顺序
  • 删除一个表的数据用哪条sql语句最合适
  • ……

2道填空题

  • 给一棵满二叉树,求叶子结点数
  • 经典蜗牛爬井,白天上爬、晚上滑落,问第几天能爬出井

https://baijiahao.baidu.com/s?id=1630167912379676900&wfr=spider&for=pc

3道问答题

  • 如何设计一个冗余较少、结构合理的数据库

https://www.cnblogs.com/0to9/p/5045256.html

第一范式(确保每列保持原子性)

第二范式(确保表中的每列都和主键相关)

第三范式(确保每列都和主键列直接相关,而不是间接相关)

  • 编程题,文本编辑器纯手撕,给一个数组,判断组中数据是否连续,不准调用库函数

max-min=length-1

元素是否重复

  • 编程题,文本编辑器纯手撕,给一个数组,判断组中数据是否连续,不准调用库函数
  • 给一个金币总额M,领取次数N,N<M,每个玩家每天领取一次
    1.设计一个合适的数据库表管理题目中的数据
    2.设计一个随机算法计算每次领取的金额,要求两次之间领取的金额不能相差过大

https://blog.csdn.net/g6U8W7p06dCO99fQ3/article/details/119656964

https://blog.csdn.net/hellojackjiang2011/article/details/108239310#t14


程序员灯塔
转载请注明原文链接:13
喜欢 (0)