Day-1

选择题

  • 1.下列选项中属于面向对象编程主要特征的是(C)
    A 继承
    B 自顶向下
    C 模块化
    D 逐步求精

    正确答案:A
    四大特征:抽象,封装,继承,多态

  • 2.在基本 JAVA 类型中,如果不明确指定,整数型的默认是 __ 类型,浮点数的默认是 __ 类型(A)
    A int float
    B int double
    C long float
    D long double

    正确答案:B
    boolean的默认值为false

  • 3.Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 (B).
    A 11 ,-11
    B 11 ,-12
    C 12 ,-11
    D 12 ,-12

    正确答案:C
    Math.round()为“四舍五入”方法,对传入的数字+0.5后向下取整,传入的参数为float返回int,传入的参数为double返回long

编程题

【组队竞赛】牛牛举办了一次编程比赛,参加比赛的有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
输入 :
2
5 2 8 5 1 5
输出:
10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.util.Arrays;
import java.util.Scanner;

/*
思路:中间值要尽可能大,所以从倒数第二个数开始,隔数相加,直到n = 0
注意:本题若使用int的res,结果会越界,故要使用long
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] nums = new int[3 * n];
while (sc.hasNext()) {
for (int i = 0; i < nums.length; i++) {
nums[i] = sc.nextInt();
}
}
Arrays.sort(nums);
long res = 0;
for (int i = nums.length - 2; n > 0; i -= 2) {
res += nums[i];
n--;
}
System.out.println(res);
}
}

Day-2

选择题

  • 1.A 派生出子类 B , B 派生出子类 C ,并且在 java 源代码有如下声明:
    A a0=new A();
    A a1=new B();
    A a2=new C();
    问以下哪个说法是正确的(B)
    A 只有第一行能通过编译
    B 第1、2行能通过编译,但第3行编译出错
    C 第1、2、3行能通过编译,但第2、3行运行时出错
    D 第1行,第2行和第3行的声明都是正确的

    正确答案:D
    多态有三种表现形式:继承重写、重载、向上转型,A a1 = new B();属于向上转型,即父类的引用指向子类的对象,
    A a2=new C();体现了继承具有传递性,也可以称为间接继承。比如所有的类都见间接继承自Object类。

  • 4.在使用superthis关键字时,以下描述正确的是(A)
    A 在子类构造方法中使用 super() 显示调用父类的构造方法,super() 必须写在子类构造方法的第一行,否则编译不通过
    B super()this() 不一定要放在构造方法内第一行
    C this()super() 可以同时出现在一个构造函数中
    D this()super() 可以在static环境中使用,包括static方法和static语句块

    B:super()this() 均需放在构造方法内第一行。
    C:this必然会调用其他的构造函数,而其他构造函数必然有super语句存在,这样会使得同一个构造函数中有相同的语句,编译不通过。
    D:this()super()都指的是对象,不能在static环境中使用。

  • 5.如下代码的结果是什么?(C)
    A Base
    B BaseBase
    C 编译失败
    D 代码运行但没有输出
    E 运行时抛出异常

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Base {
    Base() {
    System.out.print("Base");
    }
    }

    public class Alpha extends Base {
    public static void main(String[] args) {
    new Alpha();
    //调用父类无参的构造方法
    new Base();
    }
    }

    正确答案:B
    创建子类对象时,会先执行父类中的构造方法,若子类的直接父类美没有无参构造器,必须在自己构造器的第一行显式指明是调用父类”super()“还是自己”this()“的哪一个构造器。
    Day-3选择题第2题考点。

  • 6.如下代码的输出结果是什么?(D)
    A 0
    B 1
    C 2
    D 编译失败

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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);
    }
    }

    静态变量只能在类主体中定义,不能在方法中定义。static直属于类,在静态方法中可以使用静态变量,但不能定义。

编程题

【排序子序列】牛牛定义排序子序列为一个数组中一段连续的子序列,并且这段子序列是非递增或者非递减排序的。牛牛有一个长度为n的整数数组A,他现在有一个任务是把数组A分为若干段排序子序列,牛牛想知道他最少可以把这个数组分为几段排序子序列.
如样例所示,牛牛可以把数组A划分为[1,2,3]和[2,2,1]两个排序子序列,至少需要划分为2个排序子序列,所以输出2
输入:
6
1 2 3 2 2 1
输出:
2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.*;

/*
数组中会有3种状态,arr[i] > arr[i + 1], arr[i] = arr[i + 1], arr[i] < arr[i + 1]
每当循环结束就代表划分了一个子序列,i++,count++
因为执行i+1操作可能发生数组越界,故创建一个n+1大小的数组
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n + 1];
while (sc.hasNextInt()) {
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
}
int i = 0;
int count = 0;
while (i < n) {
if (arr[i] < arr[i + 1]) {
while (i < n && arr[i] < arr[i + 1]) {
i++;
}
count++;//退出循环表示划分了一个子序列
i++;
} else if (arr[i] == arr[i + 1]) {
i++;
} else {
while (i < n && arr[i] > arr[i + 1]) {
i++;
}
count++;
i++;
}
}
System.out.println(count);
}
}

Day-3

选择题

  • 1.以下代码运行输出的是(C)
    A 输出:Person
    B 没有输出
    C 编译出错
    D 运行出错

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Person {
    private String name = "Person";
    int age = 0;
    }

    public class Child extends Person {
    public String grade;

    public static void main(String[] args) {
    Person p = new Child();
    System.out.println(p.name);
    }
    }

    1.一个JAVA文件中不能有两个pubilc类。
    2.private修饰的变量只能在内内部才能访问,其子类也不能访问。
    3.若改为Person p = new Person();也不无法访问name,因为此时仍处于子类的作用域。

  • 2.以下程序的输出结果为(D)
    A BD
    B DB
    C C
    D 编译错误

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    class Base {
    public Base(String s) {
    System.out.print("B");
    }
    }

    public class Derived extends Base {
    public Derived(String s) {
    // super(s);
    System.out.print("D");
    }

    public static void main(String[] args) {
    new Derived("C");
    }
    }

    创建子类对象会默认先调用父类的空参构造方法,此时父类已经创建有参构造器,则不会自动创建空参构造器,super()就会编译出错,正确做法如代码中注释。

  • 10.在创建派生类对象,构造函数的执行顺序(C)
    A 基类构造函数,派生类对象成员构造函数,派生类本身的构造函数
    B 派生类本身的构造函数,基类构造函数,对象成员构造函数
    C 基类构造函数,派生类本身的构造函数,派生类对象成员构造函数
    D 对象成员构造函数,基类构造函数,派生类本身的构造函数

    正确答案:A
    1.初始化父类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化。
    2.初始化子类中的静态成员变量和静态代码块,按照在程序中出现的顺序初始化。
    3.初始化父类的普通成员变量和代码块,再执行父类的构造方法。
    4.初始化子类的普通成员变量和代码块,在执行子类的构造方法。

编程题

  • 1.字符串中找出连续最长的数字串
    输入:
    abcd12345ed125ss123456789
    输出:
    123456789

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /*
    使用split方法将字符串按字符分割开即可,"[a-z]"为正则表达式.
    */
    import java.util.*;

    public class Main {
    public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String s = sc.nextLine();
    String[] sp = s.split("[a-z]");
    String res = "";
    for (String str : sp) {
    if (str.contains(" ")) {
    continue;
    }
    if (res.length() < str.length()) {
    res = str;
    }
    }
    System.out.println(res);
    }
    }

    -String.split(String regex, int limit)用法:limit不显式指明时默认为0。
    limit = 0:尽可能的多匹配, 且长度无限制, 但结尾空字符串将被丢弃。
    limit < 0:尽可能的多匹配, 且长度无限制。
    limit > 0:最多匹配limit-1次,得到一个长度为limit的数组. String[limit-1]为余下未匹配的字符串。

  • 2.【数组中出现次数超过一半的数字】
    给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
    例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
    要求:空间复杂度:O(1),时间复杂度O(N)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /*
    摩尔投票法:不同的两者一旦相遇就彼此抵消,最后剩下来的值都是相同的
    */
    public class Solution {
    public int majorityElement(int[] nums) {
    int res = 0, count = 0;
    for (int i = 0; i < nums.length; i++) {
    if (count == 0) {
    res = nums[i];
    count++;
    } else {
    if (res == nums[i]) {
    count++;
    } else {
    count--;
    }
    }
    }
    return res;
    }
    }

Day-4

选择题

  • 4.java语言的下面几种数组复制方法中,哪个效率最高?(C)
    A for 循环逐一复制
    B System.arraycopy
    C Array.copyOf
    D 使用clone方法

    正确答案:B
    System.arraycopy是一个静态本地方法,由虚拟机实现,效率最高。
    浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存,换言之,修改修对象会影响到原对象。
    深拷贝:会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”。

  • 9.下面哪些类实现或继承了 Collection 接口?(BCD)
    A HashMap
    B ArrayList
    C Vector
    D Iterator

    正确答案:BC
    HashMap继承自Map接口,而Iterator接口是Collection的父类。

编程题

进制转换:给定一个十进制数M,以及需要转换的进制数N。将十进制数M转化为N进制数。
输入:
7 2
输出:
111

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.Scanner;

/*
需要考虑负数情况!刚开始没考虑卡了我好久。
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);

while (in.hasNextInt()) {
int m = in.nextInt();
int n = in.nextInt();
StringBuilder s = new StringBuilder();
String table = "0123456789ABCDEF";
boolean flag = false; //用flag标记负数
if (m < 0) {
m = -m;
flag = true;
}
if (m == 0) {
s.append('0');
}
while (m != 0) {
s.append(table.charAt(m % n));
m /= n;
}
if (flag) {
s.append('-');
}
s.reverse();
System.out.println(s);
}
}
}

Day-5

选择题

  • 2.以下代码结果是什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class foo {
    public static void main(String sgf[]) {
    StringBuffer a = new StringBuffer("A");
    StringBuffer b = new StringBuffer("B");
    operate(a, b);
    System.out.println(a + "." + b);
    }

    static void operate(StringBuffer x, StringBuffer y) {
    x.append(y);
    y = x;
    }
    }

    值传递:在调用函数时将实际参数复制一份传递到方法中,在方法中修改参数不会影响到实际参数。
    引用传递:将实际参数的地址值传入方法,此题中y = x这一步是让y指向了x,而实际的B还是指向它自己。
    图示

  • 3.在JAVA中,假设A有构造方法A(int a),则在类A的其他构造方法中调用该构造方法和语句格式应该为(A)
    A this.A(x)
    B this(x)
    C super(x)
    D A(x)

    正确答案:B
    A.这是调用普通方法的写法
    C.这是显示调用父类构造方法
    D.调用静态方法

  • 7.下列哪个说法是正确的(A)
    A ConcurrentHashMap使用synchronized关键字保证线程安全
    B HashMap实现了Collction接口
    C Array.asList方法返回java.util.ArrayList对象
    D SimpleDateFormat是线程不安全的

    正确答案:D
    A.JDK1.7 中采用segment的分段锁机制实现线程安全,而JDK1.8采用CAS+Synchronized保证线程安全。
    B.HashMap实现了Map接口。
    C.Arrays.asList()方法返回的是Arrays.ArrayList类型。

编程题

【连续最大和】一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3.
输入:
3 -1 2 1
输出:
3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import java.util.*;
/*
动态规划直接秒杀
因为这里只需要最后的结果,所以dp可以不用定义成数组,空间复杂度优化为:O(1)
*/
public class Main {
public static void main(String[] agrs) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
while (sc.hasNextInt()) {
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
}
int dp = arr[0];
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
dp = Math.max(arr[i], dp + arr[i]);
max = Math.max(max, dp);
}
System.out.println(max);
}
}

Day-6

选择题

  • 1.下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换:(D)
    byte[] src,dst;
    A.dst=String.fromBytes(src,"GBK").getBytes("UTF-8")
    B.dst=new String(src,"GBK").getBytes("UTF-8")
    C.dst=new String("GBK",src).getBytes()
    D.dst=String.encode(String.decode(src,"GBK")),"UTF-8" )

    正确答案:B
    思路为解码->还原->编码,然而String并没有fromBytesencode这两个静态方法。

  • 3.下列哪个对访问修饰符作用范围由大到小排列是正确的?(B)
    A private>default>protected>public
    B public>default>protected>private
    C private>protected>default>public
    D public>protected>default>private

    正确答案:D
    public:当前类,子类,包,其他包
    protected:当前类,子类,包
    default:当前类,包内
    private:当前类

  • 5.阅读下列程序,选择哪一个是正确的输出结果(C)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class HelloA {
    public HelloA() {
    System.out.println("I’m A class ");
    }

    static {
    System.out.println("static A");
    }
    }

    public class HelloB extends HelloA {
    public HelloB() {
    System.out.println("I’m B class");
    }

    static {
    System.out.println("static B");
    }

    public static void main(String[] args) {
    new HelloB();
    }
    }

    A static A I’m A class static B I’m B class
    B I’m A class I’m B class static A static B
    C static A static B I’m A class I’m B class
    D I’m A class static A I’m B class static B

    对应Day-3选择题第二题

  • 8.在Java中下面Class的声明哪些是错误的?(BCD)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    A:
    public abstract final class Test {
    abstract void method();
    }
    B:
    public abstract class Test {
    abstract final void method();
    }
    C:
    public abstract class Test {
    abstract void method() {
    }
    }
    D:
    public class Test {
    final void method() {
    }
    }

    正确答案:ABC
    A.final修饰的类为终态类,不能被继承,而抽象类必须被继承才有意义。
    B.final修饰的方法不能被重写,而继承抽象类必须重写其抽象方法。
    C.抽象方法仅声明,并不做实现的方法。

  • 10.下面哪些赋值语句是正确的(ABDE)
    A long test=012
    B float f=-412
    C int other =(int)true
    D double d=0x12345678
    E byte b=128

    正确答案:ABD
    byte的取值范围为-128~127,因此会抛出异常:java: 不兼容的类型: 从int转换到byte可能会有损失
    也可写为byte b = (byte) 128; 此时b = -128。

编程题

【把字符串转换成整数】
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0.
注意:
①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0
②字符串中可能出现 +/- 且仅可能出现在字符串首位。
输入:
+2147483647
1a33
输出:
2147483647
0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/*
本题存在漏洞:当str = "-2147483649"时,按理应该返回0,但返回2147483649仍然可以AC
希望官方有朝一日能修复
*/
import java.util.*;

public class Solution {
public int StrToInt(String str) {
char[] c = str.toCharArray();
if (str == null || str.length() == 0) {
return 0;
}
boolean flag = false;//用flag标记是否为负数
int res = 0;
if (c[0] == '+' || c[0] == '-') {
if (c[0] == '-') {
flag = true;
}
str = str.substring(1);//如果首位出现+或者-,剪掉首位
c = str.toCharArray();
}
int num = getNum(c.length);
for (int i = 0; i < c.length; i++) {
if (c[i] < '0' || c[i] > '9') {
return 0;
} else {
res += ((c[i] - '0') * num);
num /= 10;
}
}
if (flag) {
return 0 - res;
}
return res;
}

private int getNum(int len) {
int num = 10;
for (int i = 0; i < len - 2; i++) {
num *= 10;
}
return num;
}
}