> 文章列表 > 【java】笔试强训Day1

【java】笔试强训Day1

【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]);}}}