X32专项练习部分08

静态方法调用

	/*
    假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?()
    public class A{
        public int i;
        static String s;
        void method1(){}
        static void method2(){}
    }
    System.out.println(a.i);
    a.method1();
    A.method1();    // 类名只能调用静态方法
    A.method2();

    正确答案:C
    静态成员和静态方法,可以直接通过 类名 进行调用
    其他的成员和方法则需要进行实例化成对象之后,通过 对象 来调用

    static修饰的成员变量和方法
    既可以通过类调用也可以通过实例(也就是对象)
    无static修饰的只能通过实例(也就是对象)调用
     */

hashcode和equals

	/*
    下面论述正确的是()?
    正确答案: D

    如果两个对象的hashcode相同,那么它们作为同一个HashMap的key时,必然返回同样的值
    如果a,b的hashcode相同,那么a.equals(b)必须返回true
    对于一个类,其所有对象的hashcode必须不同
    如果a.equals(b)返回true,那么a,b两个对象的hashcode必须相同

    那么equals()既然已经能实现对比的功能了
    为什么还要hashCode()呢?因为重写的equals()里一般比较的比较全面比较复杂
    这样效率就比较低,而利用hashCode()进行对比
    则只要生成一个hash值进行比较就可以了,效率很高

    那么hashCode()既然效率这么高为什么还要equals()呢
    因为hashCode()并不是完全可靠
    有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题
    所以hashCode()只能说是大部分时候可靠,并不是绝对可靠
    1、如果两个对象相等,那么他们一定有相同的哈希值(hash code)。
    2、如果两个对象的哈希值相等,那么这两个对象有可能相等也有可能不相等。(需要再通过equals来判断)

    所以我们可以得出:
    1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
    2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
    所有对于需要大量并且快速的对比的话如果都用equals()去做显然效率太低
    所以解决方式是,每当需要对比的时候
    
    首先用hashCode()去对比,如果hashCode()不一样
    则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了)
    如果hashCode()相同,此时再对比他们的equals()
    如果equals()也相同,则表示这两个对象是真的相同
    这样既能大大提高了效率也保证了对比的绝对正确性
    
    补充这么多,再看选项
    A:在hashmap中,key值是不可能重复的
    由hashCode和equals方法共同判断key值是否相等
    即使两个对象的hashCode相同相等,也不能说他们的key值相等。
    B和D:如果x.equals(y)返回true,那么这两个对象的hashCode返回的整数结果必然相同
    如果x.equals(y)返回false,则不一定;
    反之,hashCode返回的值不相等,则equals方法返回值一定不相等。hashCode返回值相等,则不一定
    C:hashCode的值是可以相同的。
     */

链表查找平均复杂度

	/*
    从一个具有 n 个结点的单链表中查找其值等于 x 结点时,在查找成功的情况下,需平均比较( )个结点。
    正确答案: D
    n
    n/2
    (n-1)/2
    (n+1)/2

    最少1次  最多n次  平均(n+1)/2次
    (1+2+3+...+n)/n=(n(n+1)/2)/n=(n+1)/2
    匹配到每一个的概率是1/n,x可能在1.2.3.4.……n,有n(n+1)/2,再乘1/n,选d
    上面三行都是解出链表平均复杂度的方法
     */

倒立的栈

	/*
	例1
    设栈的存储空间为 S(1:60) ,初始状态为 top=61
    现经过一系列正常的入栈与退栈操作后, top=1 ,则栈中的元素个数为( )

    正确答案: A
    60
    59
    0
    1

    初始状态为top=61代表这个栈为空
    栈底为60 栈顶为1 栈顶也包括元素
    一共60个元素
    
    例2
    设栈的存储空间为 S(1:50) ,初始状态为 top=51
    现经过一系列正常的入栈与退栈操作后, top=50 ,则栈中的元素个数为( )

    正确答案: A
    1
    0
    50
    49
    
    和上面的解题方法一样
    51 - 50 = 1

	例3
	设栈的顺序存储空间为 S(0:49) ,栈底指针 bottom=49 ,栈顶指针 top=30 (指向栈顶元素)。则栈中的元素			 个数为( )。
	正确答案:C

	30
	29
	20
	19
     */

存储密度

	/*
    单链表的存储密度
    
    大于1
    等于1
    小于1
    不能确定
    
    正确答案:C
    存储密度 = 单链表数据项所占空间 / 结点所占空间
    单链表的存储结构是两个空间
    一个存放数据 一个作为指针指向下一个节点
    所以存储密度为 1 / 2
     */

链表合并

	/*
    已知两个长度分别为m 和 n 的升序链表,若将它们合并为一个长度为 m+n 的降序链表,则最坏情况下的时间复杂度是( )。

    O(n)
    O(m+n)
    O(min(m ,n))
    O(max(m,n))
    
    链表1和链表2顺序遍历,较小的放入结果链表后端
    结果链表要空间复杂度O(m+n),时间复杂度O(m+n)
    
    所以说在遍历的时候就已经排好序了
    所以只有顺序遍历两个时间复杂度之和
     */

出栈序列

	/*
    3个数顺序(依次)进栈,出栈序列有( )种。

    正确答案: B
    4
    5
    6
    7

    假设入栈顺序是 3、2、1
    出栈顺序可以作如下推测:
    第一个出栈的数是 1,那么后两个数的组合可以是 23 或者 32,32 不可能
    第一个出栈的数是 2,那么后两个数的组合可以是 13 或者 31,两者都符合
    第一个出栈的数是 3,那么后两个数的组合可以是 12 或者 21,两者都符合
    所以一共有 5 种出栈顺序
     */

循环链表长度

	/*
    设循环队列的容量为50(序号从0到49),现经过一系列的入队和出队运算后
    有 front=16,rear=5(rear指向队尾元素的后一位置),当前循环队列中元素个数为
    
    11
    39
    40
    12
    
    求元素的长度公式:
    length = (rear - front + size) % size
    rear mains the next node of the last node
     */

总目录

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

muskfans

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值