Java经典笔试题—day06

🔎选择题

(1)关于抽象类与最终类,下列说法错误的是?

A. 抽象类能被继承,最终类只能被实例化。
B. 抽象类和最终类都可以被声明使用
C. 抽象类中可以没有抽象方法,最终类中可以没有最终方法
D. 抽象类和最终类被继承时,方法可以被子类覆盖

D

A, D.
最终类又称为密封类, 是由 final 修饰, 因此最终类只能被实例化
抽象类只能被继承

(2)在Java中下面Class的声明哪些是错误的?

A. public abstract final class Test { abstract void method(); }
B. public abstract class Test { abstract final void method(); }
C. public abstract class Test { abstract void method() { } }
D. public class Test { final void method() { } }

A, B, C

A, B. final 与 abstract 不能同时出现
C. abstract 修饰的方法不能有 { }

(3)已知表达式int m[]={0,1,2,3,4,5,6};下面哪个表达式的值与数组下标量最大值相等?

A. m. length()
B. m. length-1
C. m. length()+1
D. m. length+1

B

(4)下列哪个对访问修饰符作用范围由大到小排列是正确的?

A. private>default>protected>public
B. public>default>protected>private
C. private>protected>default>public
D. public>protected>default>private

D

public > protected > default(默认) > private
在这里插入图片描述
图片来自网络

(5)有六个元素6,5,4,3,2,1顺序入栈,问下列哪一个不是合法的出栈序列?()

A. 5 4 3 6 2 1
B. 4 5 3 1 2 6
C. 3 4 6 5 2 1
D. 2 3 4 1 5 6

C

在这里插入图片描述

(6)阅读下列程序,选择哪一个是正确的输出结果

class HelloA{
	public HelloA() {
 		System.out.println("I’m A class ");
 	}
 	static {
 		System.out.println("static A");
 	}
}
public class HelloB extends HelloA{
 	public HelloB() {
		System.out.println("I’m B class");
 	}
 	static {
 		System.out.println("static B");
 	}
 	public static void main (String[] args){
 		new HelloB();
 	}
}

A. static A I’m A class static B I’m B class
B. I’m A class I’m B class static A static B
C. static A static B I’m A class I’m B class
D. I’m A class static A I’m B class static B

C

执行顺序
静态代码块(static 修饰的代码块) > 构造块(类内部, 构造方法外部的代码块) > 构造方法
其中静态代码块不管 new 多少个对象, 都只会执行一次
由于子类 HelloB 继承父类 HelloA, 所以先去执行父类的静态代码块, 再去执行子类的静态代码块. 先去执行父类的构造方法, 再去执行子类的构造方法

(7)执行下列代码的输出结果是( )

public class Demo{
 	public static void main(String args[]){
   int num = 10;
   System.out.println(test(num));
	}
	public static int test(int b) {
   try {
    b += 10;
    return b;
   } catch(RuntimeException e) {
   
   } catch(Exception e2) {
   
   } finally {
    b += 10;
    return b;
   }
  }
}

A. 10
B. 20
C. 30
D. 40

C

finally 一定会被执行, 所以 b = 30

(8)下列关于构造方法的叙述中,错误的是()

A. java语言规定构造方法名与类名必须相同
B. java语言规定构造方法没有返回值,但不同void声明
C. java语言规定构造方法不可以重载
D. java语言规定构造方法只能通过new自动调用

C, D

C. 构造方法可以重载(一个类中可以有多个构造方法)
D. 子类继承父类时, 也可以通过 super() 调用父类的构造方法

(9)下面哪些赋值语句是正确的()

A. long test=012
B. float f=-412
C. int other =(int)true
D. double d=0x12345678
E. byte b=128

A, B. D

C. 布尔类型无法强转为数值
E. byte 类型的取值范围为 -128 ~ 127
在这里插入图片描述

(10)下列代码的输出结果是 ( )

boolean b = true ? false : true == true ? false : true;
System.out.println(b);

A. true
B. false
C. null
D. 空字符串

B

当表达式1 的结果为 true 时, 执行表达式2
当表达式1 的结果为 false 时, 执行表达式3
在这里插入图片描述

🔎编程题

🥝不要二

题目描述

二货小易有一个W*H的网格盒子,网格的行编号为0 ~ W-1,网格的列编号为0 ~ H-1
每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。

对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
小易想知道最多可以放多少块蛋糕在网格盒子里。

输入描述

每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

输出描述

输出一个最多可以放的蛋糕数

在这里插入图片描述

解题思路

根据题意得知这是一个 W * H 大小的矩阵

题目要求任意两块蛋糕的欧几里得距离不能等于2
即 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根不等于2
即 (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) 不等于4

  • 两数相加的和为4有下列几种可能
    • 1 + 3 = 4
    • 3 + 1 = 4
    • 2 + 2 = 4
    • 0 + 4 = 4
    • 4 + 0 = 4

对于 1 + 3 = 4, 因为矩阵的行编号为 0 ~ W-1, 列编号为 0 ~ H-1, 所以不可能出现(y1 - y2) = 3 \sqrt 3 3

对于 3 + 1 = 4, 因为矩阵的行编号为 0 ~ W-1, 列编号为 0 ~ H-1, 所以不可能出现(x1 - x2) = 3 \sqrt 3 3

对于 2 + 2 = 4, 因为矩阵的行编号为 0 ~ W-1, 列编号为 0 ~ H-1
所以不可能出现(x1 - x2) = 2 \sqrt 2 2 , (y1 - y2) = 2 \sqrt 2 2

对于 0 + 4 = 4, 得出 x1 == x2, y1 - y2 = 2

对于 4 + 0 = 4, 得出 y1 == y2, x1 - x2 = 2

注意, y1 - y2 = -2, 其平方的值也是4
因为遍历矩阵时是从(0, 0) 开始遍历, 所以只需要计算当前的列 + 2的结果即可
x1 - x2 同理

import java.util.Scanner;

//不要二
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNextInt()) {
            int W = scan.nextInt();//列
            int H = scan.nextInt();//行
            int[][] matrix = new int[W][H];

            getCnt(W, H, matrix);
        }
    }

    // 计算蛋糕数
    private static void getCnt(int w, int h, int[][] matrix) {
        int cnt = 0;
        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {
            	// 判断当前位置能否防止蛋糕
                if(matrix[i][j] == 0) {
                    cnt++;
                    // 防止越界
                    // 将当前行 + 2 设置为1表示不能该位置不能放置蛋糕
                    if(i + 2 < w) matrix[i + 2][j] = 1;
                    // 将当前列 + 2 设置为1表示不能该位置不能放置蛋糕
                    if(j + 2 < h) matrix[i][j + 2] = 1;
                }
            }
        }
        System.out.println(cnt);
    }
}

📢题目链接
链接: link


🥝把字符串转换成整数

题目描述

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。
数值为 0 或者字符串不是一个合法的数值则返回 0

注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。

输入描述

输入一个字符串,包括数字字母符号,可以为空

输出描述

如果是合法的数值表达则返回该数字,否则返回0

在这里插入图片描述

解题思路

定义 sum 用于表示返回的结果
定义 judge 判断给定的字符串是否包含负号
定义 idx 判断第 0 位是否为符号位

从字符串的不是符号位开始遍历
如果当前的字符不是数字, 返回0
当前的字符是数字, 将当前的结果保存到 sum 中

public static int StrToInt(String str) {
        if(str == null || str.length() == 0 || str.equals("0")) return 0;
        char[] chs = str.toCharArray();
        int sum = 0, judge = 1, n = chs.length, idx = 0;
        // 判断是否为数字
        if(!Character.isDigit(chs[0])) {
            // 既不是符号, 也不是数字
            if (chs[0] != '+' && chs[0] != '-') {
                return 0;
            } else {
                if(chs[0] == '-') judge = -1;
                idx = 1;
            }
        }
        for (int i = idx; i < n; i++) {
            if(!Character.isDigit(chs[i])) return 0;
            sum = sum * 10 + chs[i] - '0';
        }
        return judge < 0 ? ~sum + 1 : sum;
 }

📢题目链接
链接: link


🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值