Java经典笔试题—day02
- 🔎选择题
- 🔎编程题
- 🥝排序子序列
- 🥝倒置字符串
- 🔎结尾
🔎选择题
(1)A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:
- A a0=new A();
- A a1=new B();
- A a2=new C();
问以下哪个说法是正确的()
A. 只有第一行能通过编译
B. 第1、2行能通过编译,但第3行编译出错
C. 第1、2、3行能通过编译,但第2、3行运行时出错
D. 第1行,第2行和第3行的声明都是正确的
D
(2)下面代码将输出什么内容:()
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin";
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}
A. true
B. false
C. 1
D. 编译错误
B
当被转换的字符串全是由小写字母组成时, 此时调用 toLowerCase() 方法, 就会 return this
当被转换的字符串不全是由小写字母组成时, 此时调用 toLowerCase() 方法, 就会 return new String
(3)阅读如下代码。请问对语句行 test.hello(). 描述正确的有()
class Test {
public static void hello() {
System.out.println("hello");
}
}
public class MyApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
Test test = null;
test.hello();
}
}
A. 能编译通过,并正确运行
B. 因为使用了未初始化的变量,所以不能编译通过
C. 以错误的方式访问了静态方法
D. 能编译通过,但因变量为null,不能正常运行
A
Test test = null, 表示 test 不指向任何对象
但是由于 hello() 方法被 static 修饰, 表示是一个静态方法(不需要对象就可以直接调用)
(4)在使用super和this关键字时,以下描述正确的是()
A. 在子类构造方法中使用 super() 显示调用父类的构造方法,super() 必须写在子类构造方法的第一行,否则编译不通过
B. super() 和 this() 不一定要放在构造方法内第一行
C. this() 和 super() 可以同时出现在一个构造函数中
D. this() 和 super() 可以在static环境中使用,包括static方法和static语句块
A
(5)如下代码的结果是什么 ?
class Base {
Base() {
System.out.print("Base");
}
}
public class Alpha extends Base {
public static void main(String[] args) {
new Alpha();
//调用父类无参的构造方法
new Base();
}
}
A. Base
B. BaseBase
C. 编译失败
D. 代码运行但没有输出
E. 运行时抛出异常
B
调用子类构造方法的同时会调用父类构造方法
(6)如下代码的输出结果是什么?
public class Test {
public int aMethod(){
static int i = 0;
i++;
return i;
}
public static void main(String args[]){
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
A. 0
B. 1
C. 2
D. 编译失败
D
static 修饰的变量只能是成员变量, 不能是局部变量
(7)下列哪一种叙述是正确的()
A. abstract修饰符可修饰字段、方法和类
B. 抽象方法的body部分必须用一对大括号{ }包住
C. 声明抽象方法,大括号可有可无
D. 声明抽象方法不可写出大括号
D
A. abstract 修饰符可以修饰方法和类, 不可以修饰字段
B, C, D 抽象方法不能含有{ }
(8)下列说法正确的有:()
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名
C. constructor在一个对象被new 时执行
D. 一个class只能定义一个constructor
C
A. 省略 constructor(构造方法)时, 编译器会默认提供一个不带参数的构造方法
B. 构造方法也属于方法, constructor 与 class 同名, 方法也可以与 class 同名
D. 方法可以重载
(9)选项中哪一行代码可以替换 //add code here 而不产生编译错误
public abstract class MyClass {
public int constInt = 5;
//add code here
public void method() {
}
}
A. public abstract void method(int a);
B. consInt=constInt+5;
C. public int method();
D. public abstract void anotherMethod(){}
A
B. 成员变量的赋值在需要在方法中完成
C. 如果是抽象方法需要 abstract 修饰. 如果是具体方法, 需要加{ }
D. 抽象方法不能含有{ }
(10)在使用 interface 声明一个外部接口时,只可以使用( )修饰符修饰该接口
A. private
B. protected
C. private protected
D. public
D
interface(接口) 默认是要被实现的, 需要被 public 修饰
🔎编程题
🥝排序子序列
题目描述
牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。
牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2
输入描述
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括n个整数A_i(1 ≤ A_i ≤ 10^9),表示数组A的每个数字。
输出描述
输出一个整数表示牛牛可以将A最少划分为多少段排序子序列
解体思路
以 1 2 3 2 2 为例
1 2 3 为非递减序列, 所以划分为1组
由于 2 小于 3, 所以不与 1 2 3 构成非递减序列
2 2 为非递增序列, 所以划分为1组
设计两个方法, 一个为 getBigger(递增), 另一个为 getSmaller(递减)
判断当前元素与它的前一个元素的大小
当前元素 > 前一个, 调用 getBigger(递增)
当前元素 < 前一个, 掉用 getSmaller(递减)
当前元素 == 前一个, i++(让当前元素变为前一个, 当前元素的下一个变为当前元素)
这里代码中数组多开辟了1个空间, 是防止最后一个元素可能没有与前面的元素进行判断的情况
此时的位置已经到达了数组的末尾, 既不是递增也不是递减, 但是循环结束了
根据题目的描述, 输入的值 >= 1, 所以新开辟的空间默认为 0 不会出错
import java.util.Scanner;
//排序子序列
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();// 输入的数字个数
int[] nums = new int[n + 1];
int ret = 0;
for(int i = 0; i < n; i++) nums[i] = sc.nextInt();// 将输入的数字存放到数组中
for(int i = 1; i < n + 1; i++) {
if(nums[i] > nums[i - 1]) {// 为递增序列
i = getBigger(nums, i, n + 1);
ret++;
} else if(nums[i] < nums[i - 1]) {// 为递减序列
i = getSmaller(nums, i, n + 1);
ret++;
}
}
System.out.println(ret);
}
// 递增
private static int getBigger(int[] nums, int index, int n) {
for(; index < n; index++) {
if(nums[index] < nums[index - 1]) {
break;
}
}
return index;
}
// 递减
private static int getSmaller(int[] nums, int index, int n) {
for(; index < n; index++) {
if(nums[index] > nums[index - 1]) {
break;
}
}
return index;
}
}
📢题目链接
链接: link
🥝倒置字符串
题目描述
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述
依次输出倒置之后的字符串,以空格分割
解题思路
去除空格, 逆序输出字符串数组
import java.util.Scanner;
//倒置字符串
public class Main2 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String str = scan.nextLine();
String[] strs = str.split(" ");
int n = strs.length;
for (int i = n - 1; i >= 0; i--) {
System.out.print(strs[i] + " ");
}
}
}
📢题目链接
链接: link
🔎结尾
创作不易,如果对您有帮助,希望您能点个免费的赞👍
大家有什么不太理解的,可以私信或者评论区留言,一起加油