【java】笔试强训Day1
⛳选择题
1.在 Java 中,存放字符串常量的对象属于 ( )类对象
A、Character B、String C、StringBuffer D、Vector
🙈大家觉得答案是什么呢
🙉答案是 B 啦~
2.已知如下类定义:
class Base {
public Base (){
//...
}
public Base ( int m ){
//...
}
public void fun( int n ){
//...
}
}
public class Child extends Base{
// member methods
}
如下哪句可以正确地加入子类中?( )
A private void fun( int n ){ //...}
B void fun ( int n ){ //... }
C protected void fun ( int n ) { //... }
D public void fun ( int n ) { //... }
🙈大家觉得答案是什么呢
🙉答案是 D 啦~
🔎思路:此题主要的考点是————子类与父类的重写————方法返回值、方法名、参数列表均均相同
❗❗注意,想要构成重写,必须有 子类的访问修饰限定大于父类的访问修饰限定
public>protected>包访问权限(默认访问权限)>private
3.假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?( )
public class A {
public int i;
static String s;
void method1(){};
static void method2(){
}
}
public class Main{
public static void main(String[] args) {
A a = new A();
}
}
A. System.out.println(a.i); B. a.method1(); C. A.method1(); D. A.method2();
🙈大家觉得答案是什么呢
🙉答案是 D 啦~
🔎思路:i 是 A 的一个属性,s 是 A 的静态方法,method1 是 A 的一个实例方法,method2 是 A 的一个实例方法
实例方法和变量调用是 实例对象.方法名/属性/变量
静态方法和变量调用是 这个类.方法/属性/变量
静态成员变量, 静态方法可以直接通过类名或对象去调用, 因此ABD正确, 非静态方法, 必须通过对象名去调用, 因此C不正确.
4.类声明种,声明一个类不能再被继承的关键字是( )
A public B abstract C final D static
🙈大家觉得答案是什么呢
🙉答案是 C 啦~
🔎思路:此题考查的是关键字的使用
public访问修饰符,可以被继承
abstract修饰的类是抽象类,可以被继承,同时子类还必须重写抽象类种的所有抽象方法。
final 修饰的类不可以被继承,final修饰的变量不可以更改
static修饰的类是一个静态类,可以被继承
5.方法通常存储在进程中的哪一区中( )
A 堆区 B 栈区 C 全局区 D 方法区
🙈大家觉得答案是什么呢
🙉答案是 D 啦~
6.在基本Java类型中,如果不明确指定,整数型的默认是( )类型,带小数的默认为( ) 类型
A int float B int double C long float D long double
🙈大家觉得答案是什么呢
🙉答案是 B 啦~
7.下列代码的执行结果是:
public class Test3{
public static void main(String[] args) {
System.out.println(100%3);
System.out.println(100%3.0);
}
}
A 1和1 B 1和1.0 C 1.0和1 D 1.0和1.0
🙈大家觉得答案是什么呢
🙉答案是 B 啦~
8.关于下列程序段的输出结果,说法正确的是( )
public class MyClass{
static int i;
public static void main(String[] argv){
System.out.println(i);
}
}
A 有错误,变量i没有初始化 B null C 1 D 0
🙈大家觉得答案是什么呢
🙉答案是 D 啦~
🔎思路:在myclass类中,i是一个静态的成员变量,最终输出的是 i , 成员变量如果没有初始化,默认值为0.
9.不考虑反射,关于私有访问修饰符private修饰的成员变量,以下说法正确的是( )
A 可以三种类所引用:该类自身、与他在同一包中的其他类,在其他包中的该类的子类
B 可以被两种类访问和引用:该类本身,该类的所有子类
C 只能被该类自身所访问和修改
D 只能被同一个包中的类访问
🔎思路:本题考查的 值访问修饰符的访问权限的大小
private | 只能被该类自身 |
default | 可以被同一个包 下的所有类访问 |
protected | 可以被同一个包下的所有类和其他包下的子类访问 |
public | 可以被同一个项目的所有类访问。 |
📝编程题
1.组队竞赛
牛客网链接:组队竞赛
牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.
输入描述:
输入的第一行为一个正整数n(1 ≤ n ≤ 10^5)
第二行包括3*n个整数a_i(1 ≤ a_i ≤ 10^9),表示每个参赛选手的水平值.输出描述:
输出一个整数表示所有队伍的水平值总和最大值.
🔎思路:想要最大即选一个最小,一个最大,另外一个是次最大值,这个时候才能取到输出最大值,就需要先排序
保证每组的第二个值取到能选择的最大值就可以,我们每次尽量取最大,但是最大的数不可能是中位数,所以退而求其次,取 每组中第二大的。
import java.util.Arrays;
import java.util.Scanner;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
int[] array = new int[3 * n];
for (int i = 0; i < 3 * n; i++) {
array[i] = scanner.nextInt();
}
Arrays.sort(array);
int sum = 0;
for (int i = 0; i < n; i++) {
sum = sum + array[array.length - 2*(i+1)];
}
System.out.println(sum);
}
}
第二种:假设有3n个数,先使用排序之后,分为3组,选最小的一个和最大值的一个及次最大值的一个
最小的肯定是前n个数,那么对于最大值和此最大值在后 n 到 3n 之中,从n开始,次最大值与下一个次最大值相差2
for (int i = n; i < 3*n; i+=2) {
sum = sum + array[i];
}
import java.util.Arrays;
import java.util.Scanner;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextInt()) {
int n = scanner.nextInt();
int[] array = new int[3 * n];
for (int i = 0; i < 3 * n; i++) {
array[i] = scanner.nextInt();
}
Arrays.sort(array);
int sum = 0;
for (int i = n; i < 3*n; i+=2) {
sum = sum + array[i];
}
System.out.println(sum);
}
}
2.删除公共字符
牛客网链接:删除公共字符
描述:
输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
输入描述:
每个测试输入包含2个字符串
输出描述:
输出删除后的字符串
第一种:使用 HashMap
去重联想到HashMap和HashSet
HashMap 可以使用两个引用,一个存放需要对比的字符串,一个存放每个字符出现的次数
HashSet 自带去除重复元素功能,在解决去除字符串中重复元素时效率最高
🔎思路:使用HashMap,首先遍历需要除去元素的字符串(str2),将每个字符串存放在HashMap中,并对其更新出现次数 ,接下来遍历需要检查的字符串,在放入前查询HashMap中对应字符的value值,如果元素没有出现,将其加入到输出字符串中,若value值大于等于1,则需要舍去 ,最后输出字符串
在进行存放输出字符串时可以采用String或者StringBuilder,在此处建议使用后者, 因为String在进行“+=”操作时会产生许多的临时变量,而StringBuer可以在原字符串的基础上进行添加操作
HashMap中采用的是引用的方法,在判断value值时不能使用“==0”进行判空操作,应该使用“==null”进行操作。
port java.util.HashMap;
import java.util.Scanner;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
HashMap<Character,Integer> hashMap = new HashMap<>();
StringBuffer str3 = new StringBuffer();
for (int i = 0; i < str2.length(); i++) {
if ( hashMap.get(str2.charAt(i)) == null) {
hashMap.put(str2.charAt(i), 1);
}
}
for (int i = 0; i < str1.length(); i++) {
if (hashMap.get(str1.charAt(i)) == null) {
str3.append(str1.charAt(i));
}
}
System.out.println(str3);
}
第二种:
import java.util.Scanner;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str1 = scanner.nextLine();
String str2 = scanner.nextLine();
char[] array = str1.toCharArray();
for (int i = 0; i < array.length; i++) {
if (!str2.contains(String.valueOf(array[i]))) {
System.out.print(array[i]);
}
}
}