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


    目录

    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)

    题目要求:

     题目分析:

     上代码

    1. import java.util.Scanner;
    2. public class Main {
    3. public static void main(String[] args) {
    4. Scanner scan = new Scanner(System.in);
    5. String str = scan.nextLine();
    6. String[] array = str.split("-");
    7. String[] arr1 = array[0].split(" ");
    8. String[] arr2 = array[1].split(" ");
    9. String s1 = "34567891JQKA2";
    10. if(array[0].equals("joker JOKER") || array[1].equals("joker JOKER")) {
    11. System.out.println("joker JOKER");
    12. }else if(arr1.length == arr2.length) {
    13. if(s1.indexOf(arr1[0].substring(0,1)) > s1.indexOf(arr2[0].substring(0,1))) {
    14. System.out.println(array[0]);
    15. }else {
    16. System.out.println(array[1]);
    17. }
    18. }else if(arr1.length == 4) {
    19. System.out.println(array[0]);
    20. }else if(arr2.length == 4) {
    21. System.out.println(array[1]);
    22. }else {
    23. System.out.println("ERROR");
    24. }
    25. }
    26. }

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

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

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


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

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

    PreparedStatement是CallableStatement的父接口

    而PreparedStatement继承自Statement

    CallableStatement继承自PreparedStatement


    4. 接口使用来实现的

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

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

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


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

     如果new对象时,不传参数

    ArrayList list = new ArrayList();

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

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


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

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

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

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

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

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

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

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


    7. 最近公共祖先

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

    题目要求:

     题目分析:

    上代码

    1. import java.util.*;
    2. public class LCA {
    3. public int getLCA(int a, int b) {
    4. while (a != b) {
    5. if(a < b) {
    6. b /= 2;
    7. }else if(a > b) {
    8. a /= 2;
    9. }
    10. }
    11. return a;
    12. }
    13. }

    8. 求最大连续bit数

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

    题目要求:

     题目分析:

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

     上代码

    1. public static void main1(String[] args) {
    2. Scanner scan = new Scanner(System.in);
    3. while (scan.hasNext()) {
    4. int n = scan.nextInt();
    5. int count = 0;
    6. int countMax = 0;
    7. while(n != 0) {
    8. if((n&1) == 1) {
    9. count++;
    10. countMax = Math.max(count,countMax);
    11. }else {
    12. count = 0;
    13. }
    14. n >>= 1;
    15. }
    16. System.out.println(countMax);
    17. }
    18. }

    思路二 

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

    在Integer类中有静态方法是

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

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

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

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

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

    上代码

    1. public static void main(String[] args) {
    2. Scanner scan = new Scanner(System.in);
    3. while (scan.hasNext()) {
    4. int n = scan.nextInt();
    5. String s = Integer.toBinaryString(n);
    6. String[] array = s.split("0");
    7. int result = 0;
    8. for (int i = 0; i < array.length; i++) {
    9. if(array[i].length() > result) {
    10. result = array[i].length();
    11. }
    12. }
    13. System.out.println(result);
    14. }
    15. }

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

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


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

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

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

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

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


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

     需要注意这道题 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)

    题目要求:

     题目分析:

     上代码

    1. import java.util.*;
    2. public class BinInsert {
    3. public int binInsert(int n, int m, int j, int i) {
    4. m <<= j;
    5. return n | m;
    6. }
    7. }

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

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


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

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

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

    1.视图的定义

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

    2.视图的作用

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

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

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

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

    3.创建视图 

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

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


  • 相关阅读:
    dc-dc线性降压恒流驱动,40V降压恒流驱动芯片
    vue脚手架安装及依赖
    LeetCode刷题---有效的括号
    怕客户跑单?这套上市制造企业都在使的订单管理方案你一定要看看
    【软件工程】二、可行性研究 & 需求分析
    【运维笔记】Centos 7.5 安装 Docker详细步骤
    算法-二叉树
    Py列表(list)
    外星人入侵游戏-(创新版)
    LoRa知识点记录
  • 原文地址:https://blog.csdn.net/m0_58761900/article/details/127539975