刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

导读:本篇文章讲解 刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

目录

1. 扑克牌大小

2.  HashMap中put相同key时会覆盖已存在的value

3. 数据库JDBC操作时使用到的接口

4. 接口使用来实现的

5. ArrayList传参,数组就是参数大小,如果没传参数组默认大小10,以1.5倍扩容

6. ReadWriteLock即为读写锁,使用于读多写少的并发场景

7. 最近公共祖先

8. 求最大连续bit数

9. 一段代码只会抛出一个异常,最有可能的是IOException​编辑

10. 检查异常需要处理,非检查异常不需要

11. 包装类是被final修饰不可变的,创建新对象,作为参数传递时,形参和实参不会指向一个地址,传入参数的值不会改变

12. 二进制插入

13. 关系数据库逻辑性强而物理性弱

14. 视图是虚表,只能查询,数据不可被修改


1. 扑克牌大小

题目链接:扑克牌大小_牛客题霸_牛客网 (nowcoder.com)

题目要求:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 题目分析:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 上代码

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String str = scan.nextLine();

        String[] array = str.split("-");
        String[] arr1 = array[0].split(" ");
        String[] arr2 = array[1].split(" ");

        String s1 = "34567891JQKA2";
        if(array[0].equals("joker JOKER") || array[1].equals("joker JOKER")) {
            System.out.println("joker JOKER");
        }else if(arr1.length == arr2.length) {
            if(s1.indexOf(arr1[0].substring(0,1)) > s1.indexOf(arr2[0].substring(0,1))) {
                System.out.println(array[0]);
            }else {
                System.out.println(array[1]);
            }
        }else if(arr1.length == 4) {
            System.out.println(array[0]);
        }else if(arr2.length == 4) {
            System.out.println(array[1]);
        }else {
            System.out.println("ERROR");
        }
    }
}

2.  HashMap中put相同key时会覆盖已存在的value

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

HashMap在插入新元素时,会使用equals()方法判断集合中是否已经存在与新元素key相同的元素,如果存在,新元素会覆盖和他key相同的对象

HashMap允许null作为key和vaule,所以这道题中先放入name-null然后第二次放name-Jack时,因为key一样所以jack会把null覆盖掉,此时map中只有一个key-value


3. 数据库JDBC操作时使用到的接口

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

这些都是进行数据库JDBC操作时用到的,用于连接数据库的时候使用的接口

PreparedStatement是CallableStatement的父接口

而PreparedStatement继承自Statement

CallableStatement继承自PreparedStatement


4. 接口使用来实现的

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

必须要明确的是接口是用来实现的,LinkedList实现List接口,

AbstractSet实现Set接口;Abstract是抽象类,HashSet继承自AbstractSet,C对

WeakHashMap继承自HashMap,而WeakMap不继承于HashMap,WeakMap也是键值对,不过是弱的引用对象,值可以为任意类型


5. ArrayList传参,数组就是参数大小,如果没传参数组默认大小10,以1.5倍扩容

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 如果new对象时,不传参数

ArrayList list = new ArrayList();

 此时add给list添加数据时,才会去创建数组,默认数组大小为10,当添加第11个元素时,才会以1.5倍当前数组大小扩容

所以要区分new ArrayList对象时传没传参数


6. ReadWriteLock即为读写锁,使用于读多写少的并发场景

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

D:volatile只保证内存可见性,不保证原子性,还有防止指令重排序作用

C:ConcurrentHashMap只给写操作加锁,读操作不加锁

A:CopyonWriteArrayList适用于写少读多的并发场景

用于替代同步List,提供更好的并发性能。写入时复制(Copy-On-Write)是每当修改时就会复制,这需要一定的开销。仅当迭代操作远远多于修改操作时,才应该使用写入时复制。即适用于读多写少

读的时候不需要加锁,如果读的时候有多个线程正在向ArrayList添加数据,读还是会读到旧的数据,因为写的时候不会锁住旧的ArrayList。

B:ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,

   读与读之间可以并发执行。在读多写少的情况下可以提高效率


7. 最近公共祖先

题目链接:最近公共祖先_牛客题霸_牛客网 (nowcoder.com)

题目要求:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 题目分析:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

上代码

import java.util.*;

public class LCA {
    public int getLCA(int a, int b) {
        while (a != b) {
            if(a < b) {
                b /= 2;
            }else if(a > b) {
                a /= 2;
            }
        }
        return a;
    }
}

8. 求最大连续bit数

题目链接:求最大连续bit数_牛客题霸_牛客网 (nowcoder.com)

题目要求:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 题目分析:

总体的步骤就是,将这个int类型转为二进制,统计连续1的个数,找出连续1个数最多的输出

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 上代码

  public static void main1(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            int count = 0;
            int countMax = 0;
            while(n != 0) {
                if((n&1) == 1) {
                    count++;
                    countMax = Math.max(count,countMax);
                }else {
                    count = 0;
                }
                n >>= 1;
            }
            System.out.println(countMax);
        }
    }

思路二 

还有一种方法,输入的是int类型的,但是计算时却是以二进制来看的

在Integer类中有静态方法是

toBinaryString(int i):返回int变量的二进制表示的字符串。
toHexString(int i):返回int变量的16进制字符串。
toOctalString(int i):返回int变量的8进制表示字符串。

所以我们这里可以使用Integer.toBinaryString来把int转为二进制字符串

此时可以使用split() 以0来进行分割,变为字符数组

此时这个数组中每个下标中放的就是连续1的字符串

对每个下标字符串求长度,就可以找到最长的输出

上代码

  public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n  = scan.nextInt();
            String s = Integer.toBinaryString(n);
            String[] array = s.split("0");

            int result = 0;
            for (int i = 0; i < array.length; i++) {
                if(array[i].length() > result) {
                    result = array[i].length();
                }
            }
            System.out.println(result);
        }
    }

9. 一段代码只会抛出一个异常,最有可能的是IOException
刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 try中出现异常,只能被一个catch捕捉到,其中最有可能的就是IOException,选A


10. 检查异常需要处理,非检查异常不需要

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

ABD是非检查异常,C是检查异常,需要用try-catch捕捉或throws声明

首先明确 异常分为检查型异常和非检查型异常

非检查异常主要是 运行时异常(RuntimeException极其子类) 和 错误(Error)。编译器是不会进行检查并且不要求必须处理的异常,当程序中出现这种异常时,即使没有“try-catch”捕捉,也没有使用“throws”抛出该异常,编译器也会正常通过

检查异常是除了“Error” 和“RuntimeException”的其他异常,这个是编译器必须要处理的异常,这种异常一般是由程序的运行环境导致的,所以必须要处理

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)


11. 包装类是被final修饰不可变的,创建新对象,作为参数传递时,形参和实参不会指向一个地址,传入参数的值不会改变

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 需要注意这道题 a 和 b 前面是byte是包装类Byte,包装类是被final修饰不可变的的,所以这里的b++是创建了一个新对象,既然是对象,那么参数传递时,传的就是地址了,值是不会被改变的

add(++a)这里把a修改为了128,但是a是byte类型取值范围是-128-127,此时a就会变为-128

然后add(b)因为传入add中的值是不会被改变的,所以输出127

也就是输出 -128 127 选D


12. 二进制插入

题目链接:二进制插入_牛客题霸_牛客网 (nowcoder.com)

题目要求:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 题目分析:

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

 上代码

import java.util.*;

public class BinInsert {
    public int binInsert(int n, int m, int j, int i) {
        m <<= j;
        return n | m;
    }
}

13. 关系数据库逻辑性强而物理性弱

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

数据库插入记录的前后顺序是否会影响查询结果,关系型数据库的逻辑性比较强,在物理关系上没有严格要求,前后顺序颠倒不会影响记录之间的关系。


14. 视图是虚表,只能查询,数据不可被修改

刷题笔记之六(扑克牌大小+最近公共祖先+求最大连续bit数+二进制插入)

视图只能被查询,数据是不可更改的 B错

首先明白什么叫视图,视图的作用是什么,怎么来创建

1.视图的定义

视图是指计算机数据库中的视图, 它是从一个或几个基本表(或视图)导出来的表,它是虚拟表。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,数据库中只存放视图的定义,而不存放视图对应的数据,这些数据还是存放在原来的基本表中。所以基本表中的数据发生变化时,视图中查询出的数据也就改变了。视图只供查询,数据不可更改

2.视图的作用

(1)视图隐藏了底层的表结构,简化了数据访问操作,客户端不再需要知道底层表的结果及其之间的关系

(2)视图提供了一个统一访问数据的接口(即可以允许用户通过视图访问数据的安全机制,而不授予用户直接访问底层表的权限)

(3)加强了安全性,使用户只能看到视图所显示的数据

(4)视图还可以被嵌套。一个视图可以嵌套另一个视图

3.创建视图 

(1)create view 视图名 as 查询语句

(2)这个视图没有就创建,有就修改 CREATE OR REPLACE VIEW 视图名 AS 查询语句;


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/91214.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!