1.实现抽象方法
已知抽象类Base中定义了calculate方法,该方法的计算过程依赖于sum()和avg(),而后两个方法均为抽象方法。要求定义Base的子类Sub类,并实现父类的抽象方法,使得main函数中的运算逻辑得以正确执行。
输入描述:
两个整数
输出描述:
两个整数的和除以两个整数的平均值(平均值为int类型,不考虑小数问题)
输入:
1 2
输出:
3
代码
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//Sub是需要你定义的子类
Base base = new Sub();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int x = scanner.nextInt();
int y = scanner.nextInt();
base.setX(x);
base.setY(y);
System.out.println(base.calculate());
}
}
}
abstract class Base {
private int x;
private int y;
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int calculate() {
if (avg() == 0) {
return 0;
} else {
return sum() / avg();
}
}
/**
* 返回x和y的和
*/
public abstract int sum();
/**
* 返回x和y的平均值
*/
public abstract int avg();
}
class Sub extends Base {
//write your code here......
public int sum() {
return getX() + getY();
}
public int avg() {
return (getX() + getY()) / 2;
}
}
2.创造新世界
众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。
输入描述:
输入数据包括x+1行:
第一行包括三个整数x(2≤x≤20),n(0≤n≤500),m(0≤m≤500),以空格分隔,
接下来的x行,每行一个01串item[i],表示第i个物品。每个物品的长度length(1≤length≤50)
输出描述:
输出一个整数,表示牛牛最多能创造多少种物品
输入
java
3 3 1
1
00
100
输出
2
代码
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt(); // 物品种类数
int n = scanner.nextInt(); // 0的数量
int m = scanner.nextInt(); // 1的数量
scanner.nextLine(); // 消耗换行符
// 存储每种物品需要的0和1的数量
int[][] counts = new int[x][2]; // counts[i][0]是0的数量,counts[i][1]是1的数量
for (int i = 0; i < x; i++) {
String item = scanner.nextLine();
int zeros = 0, ones = 0;
for (char c : item.toCharArray()) {
if (c == '0') zeros++;
else ones++;
}
counts[i][0] = zeros;
counts[i][1] = ones;
}
// 动态规划
// dp[i][j]表示使用i个0和j个1最多能创造的物品种类数
int[][] dp = new int[n + 1][m + 1];
for (int k = 0; k < x; k++) {
int zerosNeeded = counts[k][0];
int onesNeeded = counts[k][1];
// 从后往前更新,避免重复选择同一种物品
for (int i = n; i >= zerosNeeded; i--) {
for (int j = m; j >= onesNeeded; j--) {
dp[i][j] = Math.max(dp[i][j], dp[i - zerosNeeded][j - onesNeeded] + 1);
}
}
}
System.out.println(dp[n][m]);
}
}
3.ISBN号码
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其中符号"-"是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。
ISBN码的首位数字表示书籍的出版语言,例如0代表英语;
第一个分隔符"-"之后的三位数字代表出版社,例如670代表维京出版社;
第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2...以此类推。用所得的结果mod11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。
例如ISBN号码0-670-82162-4中的识别码4是这样得到的:
对067082162这9个数字,从左至右,分别乘以1,2,...,9,再求和,即
0×1+6×2+...+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出"Right";如果错误,则输出你认为是正确的ISBN号码。
输入描述
只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。
输出描述
共一行,假如输入的ISBN号码的识别码正确,那么输出"Right",否则,按照规定的格式,输出正确的ISBN号码(包括分隔符"-")。
示例1
输入:0-670-82162-4
输出:Right
示例2
输入:0-670-82162-0
输出:0-670-82162-4
代码
java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String isbn = scanner.nextLine();
scanner.close();
// 移除所有分隔符,提取数字部分
String cleaned = isbn.replaceAll("-", "");
// 前9位是计算识别码的基础
String mainPart = cleaned.substring(0, 9);
// 输入的识别码
char inputCheck = cleaned.charAt(9);
// 计算识别码
int sum = 0;
for (int i = 0; i < 9; i++) {
int digit = mainPart.charAt(i) - '0';
sum += digit * (i + 1);
}
// 计算正确的识别码
int mod = sum % 11;
char correctCheck;
if (mod == 10) {
correctCheck = 'X';
} else {
correctCheck = (char) ('0' + mod);
}
// 检查是否正确
if (inputCheck == correctCheck) {
System.out.println("Right");
} else {
// 构建正确的ISBN号码(保持原格式)
StringBuilder correctIsbn = new StringBuilder(isbn);
correctIsbn.setCharAt(isbn.length() - 1, correctCheck);
System.out.println(correctIsbn.toString());
}
}
}