Java经典笔试题—day02

🔎选择题

(1)A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:

  1. A a0=new A();
  2. A a1=new B();
  3. 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


🔎结尾

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值