笔试练习Day01

 目录

选择题:

题一:

String 类:

StringBuffer 类的详解:

关于 Vector 的详解:

编程题:

题一:组队竞赛

题二:删除公共字符串



选择题:

题一:

String 类:

  • String 类对象可以存放字符串常量,但StringBuffer类对象不可以;
  • String类是被 final 修饰的;

StringBuffer 类的详解:

  • StringBuffer 类(字符串缓冲区):类似一个字符容器,当在其中增加或删除字符时,操作的都是字符容器,因此不会产生新的 StringBuffer 对象,这样也可以降低开销;
  • 方法:
    方法 功能
    StringBuffer append(char c) 添加字符到StringBuffer对象的末尾
    StringBuffer insert(int offset, String str) 在StringBuffer对象的 offset 位置插入字符串 str
    StringBuffer deleteCharAt(int index) 删除StringBuffer对象中指定位置的字符
    StringBuffer delete(int start, int end) 删除StringBuffer对象中指定范围的字符串或字符
    StringBuffer replace(int start, int end, String s) 将StringBuffer对象中指定范围的字符或字符串用新的字符串替换掉
    void setCharAt(int index, char ch) 修改指定位置的字符为 ch
    String toString() 返回StringBuffer缓冲区对应字符串对象
    StringBuffer reverse() 将StringBuffer对象的字符串翻转

关于 Vector 的详解:

  • Vector(集合类):Vector类是在java中实现自动增长的对象数组,以适应创建Vector 后进行增添或删除操作。与数组一样,可以使用整数索引进行访问组建;
    (拓展)Vector 是线程安全的,底层使用 synchronized 进行加锁;

  • 接口方面:
    • Vector 实现 List 接口,继承 AbstractList 类,所以可以将其看做是队列,支持队列基本操作;
    • Vector 实现 RandmoAccess 接口,即具有随机访问、快速访问功能;
    • Vector 实现 Cloneable 接口,支持 clone() 方法,可以被克隆;
    • Vector 实现 Serializable 接口,支持序列化;
  • 成员变量方面:
            Vector 提供了 elementData、elementCount、capacityIncrement 三个成员变量:
  •  elementdata:由 Object 封装的动态数组,其中保存了 Vector 的元素,默认大小为 10;
  • elementCount:Vector 对象中元素个数;
  • capacityIncrement:数组扩容时的参考参数;不指定其值的时候,数组大小翻倍,指定了就按照指定大小增容;

题二:

         此题一看就是在考察继承类的访问修饰限定符问题,四个选项都是重写父类的 fun() 方法,并且方法参数、返回值都相同,唯一不同的是访问修饰限定符,于是想到:子类重写父类方法,访问修饰权限必须 ≥ 父类的访问修饰权限,此处父类都是 public,那么子类只能是 public 了。

题三:

 堆区:

  •         在java中,凡是 new 出来的对象一般都放在堆区中,堆中的对象生命周期由 JVM 的 GC 垃圾回收机制统一管理;
  •         类的非静态成员变量也在堆区里,其中,对于基本数据类型直接保存其值,对于复杂类型保存的是其指向对象的引用;

  栈区:

  •         栈区主要放一些运行期间用到的基本数据类型的局部变量,或者指向其他对象的一些引用,因为运行起来的方法的内存会分配在栈中,当程序运行结束,对应的空间就会被释放;

全局区:

  •         存放全局变量静态变量以及常量,在程序结束后由操作系统释放;

方法区:

  •         各个线程共享的内存区域,存放.class二进制文件,包含类信息、静态变量、常量池;

题四:

  • public:对所有类可见;
  • protected:对所有子类和同一个包中的所有其他类可见;
  • private:仅对该类自身可见,其他类、其子类都不可见;
  • 默认修饰权限:对同一个包中的所有类可见;

编程题:

题一:组队竞赛

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

牛牛举办了一次编程比赛,参加比赛的有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),表示每个参赛选手的水平值.

输出描述:

输出一个整数表示所有队伍的水平值总和最大值.

示例1

输入

2
5 2 8 5 1 5

输出

10
题解分析:
        每个队伍的水平值为一组三人中中间大的值,那么可以想到先对所有队员的水平值排成升序,那么每一个队伍都取一个最小值、再依次倒序取两个最大的值,组成的三个值之和,正好是所有分配情况中最大的;如图:

        在数组中如何取值?

        有几个队伍就要分配几组,也就会产生几个水平值,所取到的水平值,也是排好序后每次数组倒数第二个值,取出后求和即可;

import java.util.*;

public class Test100449 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            int n = scan.nextInt();
            int[] member = new int[3 * n];
            for (int i = 0; i < member.length; i++) {
                member[i] = scan.nextInt();
            }
            // 排序
            Arrays.sort(member);
            // 有几组就取几次
            long count = 0;
            int cur = member.length;
            while (n-- > 0) {
                count += member[cur -= 2];
            }
            System.out.println(count);
        }
    }
}

题二:删除公共字符串

链接:删除公共字符_牛客题霸_牛客网

描述

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

输入描述:

每个测试输入包含2个字符串

输出描述:

输出删除后的字符串

示例1

输入:

They are students. 
aeiou

输出:

Thy r stdnts.
题解分析:
①暴力法:使用两个“指针”遍历两个字符串.......;光查询的效率就极低,O(N^2),更别说考虑要不要删除了,肯定拿不掉 offer;
②筛选法:先将要删除的字符全部存入到 Set 里,再拿着给定字符串去 Set 中检查,存在该字符,就跳过,不存在,说明不是要删的。如果真的在原字符串进行删除,就得涉及到字符串整体移动,这样会导致效率降低,不妨使用 “字符串追加”;
public class Test69390 {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            String source = scan.nextLine();
            String target = scan.nextLine();

            StringBuffer newStr = remove(source,target);
            System.out.println(newStr.toString());
        }
    }

    private static StringBuffer remove(String source, String target) {
        StringBuffer stringBuffer = new StringBuffer();
        Set<Character> set = new HashSet<>();
        // 遍历 target 往 set 里放
        for (int i = 0; i < target.length(); i++) {
            set.add(target.charAt(i));
        }
        // 遍历 source,在 set 中没有就追加
        for (int i = 0; i < source.length(); i++) {
            char ch = source.charAt(i);
            if (!set.contains(ch)) {
                stringBuffer.append(ch);
            }
        }
        return stringBuffer;
    }
}

猜你喜欢

转载自blog.csdn.net/m0_65190367/article/details/130211715
今日推荐