Java程序设计(2021春)——第四章接口与多态课后题(选择题+编程题)答案与详解


第四章选择题

Tip:选择题部分我只针对部分我出错的或我认为有价值的题目在此整理。

4.0 导学


4.1接口


4.2.1-4.2.2-类型转换


4.2.3-方法的查找

T2

题面

已知

import java.io.*;

class Person {
public static void print() {
System.out.print("Person");
}
} class Employee extends Person {
public void print() {
System.out.print("Employee");
}
} class Manager extends Employee {
public void print() {
System.out.print("Manager");
}
} public class Test {
public static void main(String[] args) {
Manager man = new Manager();
Employee emp1 = new Employee();
Employee emp2 = (Employee) man;
Person person = (Person) man;
emp2.print();
System.out.print("#");
person.print();
} }

对于以上代码,其输出结果是

A Employee#Person

B Manager#Person

C Employee#Manager

D Manager#Manager

答案

D

详解

man所指向的对象是Manager()类型的,emp2为经由强转的man的引用,



3.5 泛型

T1

题面

Java泛型机制的优点有

A 可以使代码编写变得简单

B 比较安全

C 消除对Object类的强制类型转换=

D 使得代码运行性能增强

答案

A B C

详解


第四章编程题

T1 字符串数字验证

题面

验证一个给定的字符串是否为数字。是则输出1,不是则输出0 一些例子:

"0"=> true

" 0.1 "=> true

"abc"=> false

"1 a"=> false

"2e10"=>true

样例输入:

2e10

样例输出:

1

思考和详解

本题就是一个模拟题,只要知道什么样的字符串符合题目的要求,直接模拟即可,不过笔者思考了一会,并没有把所有的情况确定出来,以下这份代码只拿到了\(70\)分,若有读者知道笔者疏漏在哪欢迎指出。

具体代码

import java.util.Scanner;

class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str;
boolean isDot = false;
boolean isE = false;
boolean isC = false;
boolean prt = false;
str = in.next();
int len = str.length();
for (int i = 0; i < len; i++) {
char c = str.charAt(i);
if (c >= '0' && c <= '9') {
isC = true;
continue;
} else if (c == '.') {
if (isDot == true || isE == true) {
System.out.println(0);
prt = true;
break;
} else {
isDot = true;
}
} else if (c == 'e') {
if (isE == true || i == 0) {
System.out.println(0);
prt = true;
break;
} else {
isE = true;
}
} else if (c == 'f' && i == len - 1) {
continue;
} else {
System.out.println(0);
prt = true;
break;
}
}
if (!prt) {
System.out.println(1);
}
}
}

T2 数组跳跃

题面

给定一个长度为N的非负的整数数组a[N],初始位置是数组的第一个位置,数组中的每一个数代表你至多能跳多远,如a[i]=3代表可以从a[i]调到a[i+3],判断你能否成功跳到数组的最后一个位置。输入为两行,第一行为数组的长度N,第二行为N个数,输出为0表示失败,1表示成功。

样例输入:

5
2 3 1 1 4

样例输出:

1

样例输入2:

5

3 2 1 0 4

输出:

0

样例解释

如输出所示

思考和详解

本题需要注意a[i]代指的时可以至多跳到a[i+a[i]]的位置,而非只能。主干思路就是一个普通的带记忆化的\(BFS\)。

具体代码

import java.util.Scanner;

public class arr {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n + 5];
int[] flag = new int[n + 105];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
flag[i] = 0;
}
int[] queue = new int[n + 105];
int rear = -1;
int head = 0;
queue[++rear] = 0;
flag[0] = 1;
while (rear >= head) {
int p = queue[head++];
if (p == n - 1) {
System.out.println(1);
System.exit(0);
}
for (int i = 1; i <= arr[p]; i++) {
if (p + i < n && flag[p + i] == 0) {
queue[++rear] = p + i;
flag[p + i] = 1;
}
}
}
System.out.println(0);
}
}

T3跳跃数组2

题面

给定一个长度为N的非负的整数数组a[N],初始位置是数组的第一个位置,数组中的每一个数代表你至多能跳多远,如a[i]=3代表可以从a[i]调到a[i+3],你的目标是以最小的跳跃次数到达终点。输入为两行,第一行为数组的长度N,第二行为N个数,输出为跳跃次数。

样例输入

5
2 3 1 1 4

样例输出

2

样例解释

\(2->3->4\),两次跳跃

思考与详解

本题和\(T2\)很像,但是有以下两点不同:

  1. 要求输出最小的跳跃次数,并且没有说明如果不能跳到终点怎么办,即,暗示所有给定输入都有解。
  2. 要求输出最小的跳跃次数。

思路和T2差不多,只需要将flag数组存储内容变成到该位置的最小部属即可,感觉有点像dp,但是笔者算法比较菜就不卖弄了。

代码如下:

import java.util.Scanner;

public class squareNumber {
public static int n, ct = 0;
public static int[] arr;
public static int ans; public static void findSquareNumber() {
for (int i = 1; i <= n; i++) {
if (i * i <= n) {
arr[ct++] = i * i;
}
}
} public static void func(int nowNum, int cnt, int flag) {
if (nowNum > n)
return;
else if (nowNum == n) {
ans = ans < cnt ? ans : cnt;
return;
} else {
for (int i = ct - 1; i >= flag; i--) {
func(nowNum + arr[i], cnt + 1, i);
}
}
} public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
in.close();
arr = new int[n + 100];
findSquareNumber();
ans = n + 100;
func(0, 0, 0); System.out.println(ans);
}
}

百度了一下发现和leetcode 279是一样的题目,考察的知识点是动态规划

这份官方题解给出了不错的思路,我就不再赘述,直接在下面给出本题的完整代码。

具体代码

import java.util.Scanner;

public class arr2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] arr = new int[n + 5];
int[] flag = new int[n + 105];
for (int i = 0; i < n; i++) {
arr[i] = in.nextInt();
flag[i] = 0;
}
int[] queue = new int[n + 105];
int rear = -1;
int head = 0;
queue[++rear] = 0;
flag[0] = 0;
while (rear >= head) {
int p = queue[head++];
if (p == n - 1) {
System.out.println(flag[p]);
System.exit(0);
}
for (int i = 1; i <= arr[p]; i++) {
if (p + i < n && flag[p + i] == 0) {
queue[++rear] = p + i;
flag[p + i] = flag[p] + 1;
}
}
}
System.out.println(0);
}
}

Java程序设计(2021春)——第四章接口与多态课后题(选择题+编程题)答案与详解的更多相关文章

  1. Java程序设计(2021春)——第四章接口与多态笔记与思考

    Java程序设计(2021春)--第四章接口与多态笔记与思考 本章概览: 4.1 接口(接口的概念和声明接口.实现接口的语法) 4.2 类型转换 4.3 多态的概念 4.4 多态的应用 4.5 构造方 ...

  2. 第四章:Django表单 - 2:Django表单API详解

    声明:以下的Form.表单等术语都指的的广义的Django表单. Form要么是绑定了数据的,要么是未绑定数据的. 如果是绑定的,那么它能够验证数据,并渲染表单及其数据,然后生成HTML表单.如果未绑 ...

  3. Java程序设计(2021春)——第二章笔记与思考

    Java程序设计(2021春)--第二章笔记与思考 本章概览: 面向对象方法的特征 抽象:从同类型对象中抽象出共同属性 封装:把数据和处理数据的方法封到一个类中 继承:在已有的类的基础上开发新的类 多 ...

  4. Java程序设计(2021春)——第一章续笔记与思考

    Java程序设计(2021春)--第一章续笔记与思考 目录 Java程序设计(2021春)--第一章续笔记与思考 Java数据类型 基本数据类型 引用类型 基本数据类型--整数类型的细节 基本数据类型 ...

  5. Java程序设计(2021春)——第一章课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第一章课后题(选择题+编程题)答案与详解 第一章选择题 1.1 Java与面向对象程 ...

  6. Java程序设计(2021春)——第二章课后题(选择题+编程题)答案与详解

    Java程序设计(2021春)--第二章课后题(选择题+编程题)答案与详解 目录 Java程序设计(2021春)--第二章课后题(选择题+编程题)答案与详解 第二章选择题 2.1 面向对象方法的特性 ...

  7. 《JAVA程序设计》 20155208 实验四 Android程序设计

    <JAVA程序设计> 20155208 实验四 Android程序设计 实验一: 实验要求: Android Stuidio的安装测试: 参考<Java和Android开发学习指南( ...

  8. 20145221 《Java程序设计》实验报告四:Android开发基础

    20145221 <Java程序设计>实验报告四:Android开发基础 实验要求 基于Android Studio开发简单的Android应用并部署测试; 了解Android组件.布局管 ...

  9. “全栈2019”Java多线程第三十四章:超时自动唤醒被等待的线程

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. 配置tomcat虚拟主机

    实例说明 本实例介绍如何配置tomcat的虚拟主机. 关键技术 关于server.xml中host这个元素,只有在设置虚拟主机是才会修改.虚拟主机是一种在一个Web服务器上服务多个域名的机制,对这个域 ...

  2. kubernates 1.20.6安装

    kubernates 安装 1. 前置要求 硬件条件 三台主机 1主2从 硬件配置 master 2核4G slave 2核2G 2. 安装 访问GitHub 仓库 https://github.co ...

  3. tomcat shutdown后,进程还存在linux系统中的解决办法

    基本原理为启动tomcat时记录启动tomcat的进程id(pid),关闭时强制杀死该进程 第一步 :vim修改tomcat下bin/catalina.sh文件,添加点东西,主要是记录tomcat的p ...

  4. Mybatis学习(4)实现关联数据的查询

    有了前面几章的基础,对一些简单的应用是可以处理的,但在实际项目中,经常是关联表的查询,比如最常见到的多对一,一对多等.这些查询是如何处理的呢,这一讲就讲这个问题.我们首先创建一个Article 这个表 ...

  5. Springboot quartz集群(3) — 多节点发送邮件

    本期将提供quartz集群能力 集群案例分析: 上一期的邮件发送功能,若在服务需要部署多节点,但定时任务不支持集群,因此,多节点定时任务势必会同时运行, 若向用户发送邮件通知,这种情况下会向用户发送两 ...

  6. netcore3.1 + vue (前后端分离)生成PDF(多pdf合并)返回前端打印

    1.使用Adobe Acrobat XI Pro编辑pdf模板 2.公共类代码 3.service层调用 4.Controller层 5.前端(Vue) 因为print.js不支持宋体,所以打算用后台 ...

  7. F5负载均衡-配置指导手册(含IPv6)

    F5负载均衡-配置手册 设备概况 图形化界面 通过网络形式访问F5任一接口地址,打开浏览器输入https://网络接口地址:或pc机直连F5的MGMT带外管理口,打开浏览器,输入https://192 ...

  8. JUnit5依赖注入与测试接口

    依赖注入 以前的JUnit的类构造方法和测试方法都是不能有参数的,JUnit Jupiter有一个颠覆性的改进,就是允许它们有入参,这样就能做依赖注入了. 如果你对pytest的fixture有了解的 ...

  9. 软件测试跟踪工具Bugzilla的安装 - Linux版本

    首先查看Linux当前版本 输入"uname -a ",可显示电脑以及操作系统的相关信息 输入"cat /proc/version",说明正在运行的内核版本 输 ...

  10. mybatis-7-缓存

    1. 一级缓存: SqlSession 级别, 默认开启, 并且不能关闭 操作数据库是需要创建 SqlSession 对象, 在对象中有一个 HashMap 用于存储缓存数据, 不同的 SqlSess ...