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