ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

X32专项练习部分02

2021-10-03 14:59:10  阅读:194  来源: 互联网

标签:X32 02 java 队列 练习 List 内存 缺页 中为


X32专项练习部分02

循环队列中的元素个数

		/*
        设顺序循环队列Q[0: M-1]的头指针和尾指针分别为F和R.
        告诉你索引最高为6
        循环队列固定长度为7
        头指针F总是指向队头元素的前一位置.尾指针R总是指向队尾元素的当前位置.
        则该循环队列中的元素个数为()
        (R-F+M)%M
        R-F
        (F-R+M)%M
        F-R

        由画图和赋值的方法就可以做出来
        假设
        循环队列固定长度为7,M = 7
        头指针指向索引3,F = 3,也就是说当前循环队列是从第4个元素开始加的
        尾指针指向索引0,R = 0
        带入A选项
        (0 - 3 + 7) % 7 = 4
        这是求循环队列剩余元素的常用办法

		如果F指向头元素的位置
        R指向尾元素下一个位置
            (r-f+MAX)%MAX
        R如果指向尾元素
            (r-f+MAX+1)%MAX
         */

包机制

/*
涉及包机制
要导入java/awt/event下面的所有类,叙述正确的是?()

    正确答案: C
    import java.awt.*和import java.awt.event.*都可以
    只能是import java.awt.*
    只能是import java.awt.event.*
    import java.awt.*和import java.awt.event.*都不可以

说明:
    java.awt.*是导入java\awt包下所有的类,并不包括其子包下的类。
    java.awt.event.*才能导入java\awt\event包下的类。
 */

接口

class A implements B {
    public static void main(String args[]) {
        int i;
        A a1 = new A();
        i = a1.k;
        System.out.println("i=" + i);
    }
}

interface B {
    int k = 10;
}
/*
上述程序的输出结果是
i = 10
说明:
    在接口里面的变量默认都是public static final的,
    它们是公共的,静态的,最终的常量
    相当于全局常量,可以直接省略修饰符
    实现类可以直接访问接口中的变量

    一个类实现某个接口时,该类将会获得接口中定义的变量、抽象方法等
    因此可以把实现接口理解为一种特殊的继承,相当于实现类继承了一个接口
补充:
	但是所有的全局变量是有默认值不会报错的,全局变量在类初始化的时候会被虚拟机	赋默认值,而局部变量却不会。
	如果只是单纯的定义为什么不会报错呢?只定义不使用没有被压入栈中,所有的报错都是在栈中产生的。

/*
再补充一下接口问题:
如果是Java 7以及以前的版本,那么接口中可以包含的内容有:1. 常量;2. 抽象方法
如果是Java 8,还可以额外包含有:3. 默认方法;4. 静态方法
如果是Java 9,还可以额外包含有:5. 私有方法
普通类可以实现接口,并且可以实现多个接口,但是只能继承一个类,这个类可以是抽象类也可以是普通类
如果继承抽象类,必须实现抽象类中的所有抽象方法,否则这个普通类必须设置为抽象类;

D项: abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
is-a,理解为是一个,代表继承关系。 如果A is-a B,那么B就是A的父类。
like-a,理解为像一个,代表组合关系。 如果A like a B,那么B就是A的接口,A实现了B的接口。
has-a,理解为有一个,代表从属关系。 如果A has a B,那么B就是A的子类。
 */
 */

多线程中断异常

/*
下面哪个行为被打断不会导致InterruptedException:(E)?

Thread.join
Thread.sleep
Object.wait
CyclicBarrier.await
Thread.suspend

答案:
说明:
    文档里面写的:当线程在活动之前或活动期间处于正在等待、休眠或占用状态且该线程被中断时
    抛出该异常

    CyclicBarrier是一个屏障类,它的await方法可以简单的理解为:
    等待多个线程同时到达之后才能继续进行
    suspend()方法已过时,严重遭到但对
        是因为 suspend() 在导致线程暂停的同时,并不会去释放任何锁资源。其他线程都无法访问被它占用的锁
        直到对应的线程执行 resume() 方法后,被挂起的线程才能继续,从而其它被阻塞在这个锁的线程才可以继续执行
    抛InterruptedException的代表方法有:
    java.lang.Object 类的 wait 方法
    java.lang.Thread 类的 sleep 方法
    java.lang.Thread 类的 join 方法
 */

泛型转让关系

/*
class A {}
class B extends A {} B <= A
class C extends A {} C <= A
class D extends B {} D <= B
下面的哪4个语句是正确的
正确答案: A C D G
The type List<A>is assignable to List. 正确 is assignable to 就是可以赋值的意思 表示A可以赋值给List
The type List<B>is assignable to List<A>.
The type List<Object>is assignable to List<?>. 正确
The type List<D>is assignable to List<?extends B>. 正确
The type List<?extends A>is assignable to List<A>.
The type List<Object>is assignable to any List reference.
The type List<?extends B>is assignable to List<?extends A>. 正确

说明:
    1. 只看尖括号里边的!!明确点和范围两个概念
    2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>
    3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围
       <? super A>代表大于等于A的范围,<?>代表全部范围
    4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
    5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错
       如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
    6. List<?>和List 是相等的,都代表最大范围

    public static void main(String[] args) {
		List<A> a;
		List list;
		list = a;   //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内
		List<B> b;
		a = b;      //B错,点之间不能相互赋值
		List<?> qm;
		List<Object> o;
		qm = o;     //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内
		List<D> d;
		List<? extends B> downB;
		downB = d;  //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中
		List<?extends A> downA;
		a = downA;  //E错,范围不能赋值给点
		a = o;      //F错,List<Object>只是一个点
		downA = downB;  //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
	}
 */

链式队列入队操作序列

/*
设指针变量fron t 表示链式队列的队头指针,指针变量rear表示链式队列的队尾指针,
指针变量s指向将要入队列的结点X,则入队列的操作序列为()。

正确答案: C
front->next=s;front=s;
s->next=rear;rear=s;
rear->next=s;rear=s;
s->next=front;front=s;

已知s作为结点X的存储地址
先让rear的下一个指向目标变为s,再把rear更新为s
先赋值,再移动指针
注意:
1.本题是链式队列,大小不受限,对于链式队列,队尾指针指向队尾元素,且有rear->next = null
2.当s指向的元素入队时,需要指向的操作有rear->next = s; s = rear,
  我们可以想象成线性链表增加元素所需要执行的操作
3.注意不要和大小固定的顺序队列混淆
 */

双栈模拟队列的最大容量

/*
用俩个栈模拟实现一个队列,如果栈的容量分别是O和P(O>P),那么模拟实现的队列最大容量是多少?
正确答案: C
O+P
2O+1
2P+1
2O-1

题目所指的最大容量的情况是:
    O:n+1 - 2n+1
    P:1 - n
说明:
    此时缓冲栈P已经满了
    再次向O里面存取元素n+1 - 2n+1
    然后缓冲栈P进行出栈操作
    随后将存储栈O进行出栈
    对应P进行压栈
    存储栈O仅剩n+1
    而缓冲栈P为n+2 - 2n+1
    存储栈进行弹栈
    注意:此时存储栈栈帧数量>1,将无法满足按顺序出队
    所以容量最大为2P + 1

    参考:https://blog.csdn.net/MissingDi/article/details/104722020/
 */

队列应用:虚拟存储系统调入淘汰

/*
有一个虚拟存储系统,若进程在内存中占3页(开始时内存为空),若采用先进先出(FIFO)页面淘汰算法,当执行如下访问页号序列后1,2,3,4,5, 1,2,5,1,2,3,4,5,会发生多少缺页?
7
8
9
10
正确答案:D
这道题一开始我没看懂,看过解析后才理解
还是挺简单的
注意:前三页同样缺页,先调入的就先淘汰
遵循先进先出原则

1、 访问1,缺页,调入1,内存中为  1, ,;
2、 访问2,缺页,调入2,内存中为  1,2,;
3、 访问3,缺页,调入3,内存中为  1,2,3;
4、 访问4,缺页,调入4,淘汰1,内存中为 4,2,3;
5、 访问5,缺页,调入5,淘汰2,内存中为 4,5,3;
6、 访问1,缺页,调入1,淘汰3,内存中为 4,5,1;
7、 访问2,缺页,调入2,淘汰4,内存中为 2,5,1;
8、 访问5,不缺页,内存中为 2,5,1;
9、 访问1,不缺页,内存中为 2,5,1;
10、访问2,不缺页,内存中为 2,5,1;
11、访问3,缺页,调入3,淘汰5,内存中为 2,3,1;
12、访问4,缺页,调入4,淘汰1,内存中为 2,3,4;
13、访问5,缺页,调入5,淘汰2,内存中为 5,3,4;
 */

两端队列应用:输入输出受限

/*
若以1234作为双端队列的输入序列,则既不能由输入受限的双端队列得到,也不能由输出受限的双端队列得到的输出序列是()
正确答案: C
1234
4132
4231
4213

说明:
    双端队列是一种同时具有队列和栈的性质的一种数据结构,
    在队列的两头都可以进行插入和删除的操作;
    输入受限:
    就是限制一端只能进行插入操作
    输出受限
    就是限制一端只能进行删除操作

    由题意可以看出
    AB两个选项是输入受限,一端输入,就是左右两端交替输出
    D是输出受限,就是左右两端交替插入,一端输出
    只有C选项和上面两行不是一个类,怎么受限都不行
    参考https://www.nowcoder.com/questionTerminal/0dd2e77c466b4f0eac68130981ca2810
 */

总目录

标签:X32,02,java,队列,练习,List,内存,缺页,中为
来源: https://blog.csdn.net/m0_54608045/article/details/120592542

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有