Java笔试题做题笔记(二)

1.要使对象具有序列化能力,则其类应该实现如下哪个接口(A)。

A java.io.Serializable

B java.lang.Cloneable,

C java.lang.CharSequence

D java.lang.Comparable

解析:

Serializable接口作用和必要性:谈谈实现Serializable接口的作用和必要性_月渐盈的博客-CSDN博客_实现serializable

A.当一个类实现了Seializable接口(该接口仅为标记接口,不包含任何方法定义),表示该类可以序列化,序列化的目的是将一个实现了Serializable接口的对象可以转换成一个字节序列,保存对象的状态。

        把该字节序列保存起来(例如:保存在一个文件里),以后可以随时将该字节序列恢复为原来的对象。甚至可以将该字节序列放到其他计算机上或者通过网络传输到其他计算机上恢复,只有该计算机平台存在相应的类就可以正常恢复为原来的对象。

B.Java中,一个类要实现clone功能,必须实现 Cloneable接口,则就要引入该包

C.字符序列接口, 实现此接口的非抽象类有String, StringBuffer, StringBuilder。从结果来讲, 该接口的主要作用就是使得三者之间在进行一部分操作(比如查找, 比较)时变得容易。

D.comparable是通用的接口,用户可以实现它来完成自己特定的比较。


2.下列选项中属于面向对象设计方法主要特征的是(A)。

A 继承

B 自顶向下

C 模块化

D 逐步求精

解析:

A.面向对象的基本概念:面向对象=对象+类+继承+通信

    面向对象的几个重要概念:对象,消息,方法性,继承性,封装性等。

B.自顶向下和自底向上的区别:何谓"自顶向下",何谓"自底向上"_Cat的专栏-CSDN博客_自顶向下和自底向上

C.模块化是一种处理复杂系统分解为更好的可管理模块的方式。

    所谓的模块化开发就是封装细节,提供使用接口,彼此之间互不影响,每个模块都是实现某一特定的功能。模块化开发的基础就是函数。模块化开发使用代码耦合度降低,模块化的意义在于最大化的设计重用,以最少的模块、零部件,更快速的满足更多的个性化需求。


3.方法通常存储在进程中的哪一区(D

A 堆区

B 栈区

C 全局区

D 方法区

解析:

代码区:存放程序的代码,即CPU执行的机器指令,并且是只读的。

常量区:存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等)

静态区(全局区):静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放

堆区:由程序员调用malloc()函数来主动申请的,需使用free()函数来释放内存,若申请了堆区内存,之后忘记释放内存,很容易造成内存泄漏

栈区:存放函数内的局部变量,形参和函数返回值。栈区之中的数据的作用范围过了之后,系统就会回收自动管理栈区的内存(分配内存 , 回收内存),不需要开发人员来手动管理。栈区就像是一家客栈,里面有很多房间,客人来了之后自动分配房间,房间里的客人可以变动,是一种动态的数据变动。


4.不考虑反射,关于私有访问控制符 private 修饰的成员变量,以下说法正确的是(C)

A 可以三种类所引用:该类自身、与它在同一包中的其他类,在其他包中的该类的子类

B 可以被两种类访问和引用:该类本身、该类的所有子类

C 只能被该类自身所访问和修改

D 只能被同一个包中的类访问

解析:

1、private修饰成员变量时,本类中可以通过实例对象.属性名进行访问。

2、其它类中不可以通过实例对象.属性名进行访问,需要通过原始类提供的get方法进行属性的访问。

3、当实例化一个对象之后,如果不给对象进行初始化。那么对象的属性会默认初始化。即:int型成员变量为0,引用类型成员变量为null,double类型成员变量为0.0


5.假设 A 类有如下定义,设 a 是 A 类的一个实例,下列语句调用哪个是错误的?(D

public class A {

        public int i;

        static String s;

        void method1(){}

        static void method2(){}

}

A System.out.println(a.i);

B a.method1();

C A.method1();

D A.method2();

解析:

正确访问如下:

public class A {
    public int i;
    static String s;
    void method1() {}
    static void method2() {}

    public static void main(String[] args) {
        A a = new A();
        System.out.println(a.i);

        System.out.println(A.s);

        a.method1();
        
        A.method2();

    }
}

6.组队竞赛

组队竞赛_牛客网笔试题_牛客网

审题:

链接:组队竞赛_牛客网笔试题_牛客网
来源:牛客网

牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第高水平值。
例如:
一个队伍三个队员的水平值分别是3,3,3.那么队伍的水平值是3  ==  3,3,3 --> 3
一个队伍三个队员的水平值分别是3,2,3.那么队伍的水平值是3  ==  2,3,3 --> 3
一个队伍三个队员的水平值分别是1,5,2.那么队伍的水平值是2  ==  1,2,5 --> 2
为了让比赛更有看点,牛牛想安排队伍使所有队伍的水平值总和最大。
如样例所示:
如果牛牛把6个队员划分到两个队伍
如果方案为:
team1:{1,2,5}, team2:{5,5,8}, 这时候水平值总和为7.
而如果方案为:
team1:{2,5,8}, team2:{1,5,5}, 这时候水平值总和为10.
没有比总和为10更大的方案,所以输出10.

思路:

先排序,当第一个和最后两个组队时,队伍水平值最大。

假设有6个队员分两组,分别是:5 2 8 5 1 5

1.排序:1  2  5  5  5  8

2.当第一个和最后两个匹配后,生成一组{1,5,8}

3.剩下的第一个和剩下的后两个匹配,生成另一组{2,5,5}

水平值:5 + 5 = 10

Java实现:

import java.util.*;

public class Main{
    public static void func(int n, int[] arr) {
        //1.排序
        Arrays.sort(arr);
        //定义最终返回值时注意int可能会越界,定义为long类型
        long sum = 0;
        int end = n * 3 - 1;

        //循环拿取剩下数组中倒数第二个值
        for (int i = 0; i <= end; i++) {
            sum += arr[end - 1];
            end -= 2;
        }
        System.out.println(sum);
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {
            int n = in.nextInt();
            int[] arr = new int[3 * n];
            for (int i = 0; i < 3 * n; i++) {
                arr[i] = in.nextInt();
            }
            func(n, arr);
        }
    }
}

7.删除公共字符

删除公共字符_好未来笔试题_牛客网

审题:

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”

思路:

利用StringBuilder:利用两个字符串接受str1,str2,再循环str1,如果遇到str1的字符不符合str2中的字符,append进StringBuilder。

Java实现:

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            String str1 = in.nextLine();
            String str2 = in.nextLine();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str1.length(); i++) {
                if (!str2.contains(str1.charAt(i) + "")) {
                    sb.append(str1.charAt(i));
                }
            }
            System.out.println(sb.toString());
        }
    }
}

//简洁版
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            char[] ch = sc.nextLine().toCharArray();
            String str = sc.nextLine();
            for(int i=0;i<ch.length;i++){
                if(!str.contains(String.valueOf(ch[i]))){
                    System.out.print(ch[i]);
                }
            }
            System.out.println();
        }
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值