【笔试训练】组队竞赛和删除公共字符

目录

一、组队竞赛

【题目描述】

【题目解析】 

【解题思路】

 【代码示例】

二、删除公共字符

【题目描述】

【解题思路】

【代码示例】


一、组队竞赛

【题目描述】

【题目解析】 

这个题的只要思路就是贪心算法,队伍中第二高的水平值等于队伍的水平值,为了让所有的队伍的水平值总和达到最大。也就是说让每个队伍中的第二大值尽可能的大。

【解题思路】

贪心算法就是每次选值时都选但概念看到的局部最优解,这里的贪心就是保证每组的第二个取值能够选择的尽可能的大就行。

这里我们将输入的数据从小到大进行排序,分N组,一个组3个人。每次从左边第一个拿一个数据,作为本组最小的数据,然后从右边拿两个数,每组第二大的数就在其中。这样分组就可以保证每组中第二大的数据尽可能的大。

 

 【代码示例】

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);

        int n = scan.nextInt();
        //这里因为分为n组,每组分3人,所以数组的总长度为3*n.
        int[] array = new int[3*n];
        for (int i = 0; i < 3 * n; i++) {
            array[i] = scan.nextInt();
        }
        //定义一个sum用来记录每组平均值总和的最大值。这里使用long类型的对象接收是因为,并不知道有多少个组,
        //也不知道输入的数据到底有多大,所以使用较大类型的变量来接收。
        long sum = 0;
        //排序属于Arrays的静态方法,可以通过类型直接调用,将数组m作为参数传给方法,进行排序
        Arrays.sort(array);
        for (int i = 0; i < n; i++) {
            sum += array[array.length-2*(i+1)];
        }
        //最后将计算的结果输出
        System.out.println(sum);

    }

}

二、删除公共字符

【题目描述】

【解题思路】

第一种解题思路,就是通过将字符串的多次拆分和拼装实现的。通过for循环遍历第二个字符串中的字符,于第一个字符串中的字符进行对比,如果在第一个中存在,则记录第一次在第一个字符串中出现的位置。将这个位置之前的字符串和这个位置之后的字符串拼接起来,在新的字符串中就实现了将这个字符删除的功能。

  1. charAt方法作用就是将指定位置的元素取出。
  2. indexOf方法的作用就是对比找到这个字符的位置,找到了返回这个字符第一次出现的位置,没有找到返回-1.
  3. substring方法这里使用了两种,一个是带两个参数的,表示的意思就是返回当前字符串从index位置开始,到end-1的位置结束的字符串;带一个参数的表示的意思是,返回从当前字符串index位置开始,到字符串结尾位置的字符串。

第二种解法就是使用HashMap的思路。

使用HashMap的K-V模型来解决,K表示字符,V表示字符出现的次数。他是一个数组加链表的结构。先遍历第二个字符,将其中的字符全部放入HashMap中,出现一次V表示的次数加一。然后再遍历第一个字符串,将HashMap中没有的字符用str变量接收,拼装,最后将str中的字符串打印。

  1. put(K,V)方法:表示向HashMap中放入数据,设置key以及对应的value
  2. get(K)方法:返回key对应的value。

【代码示例】

  • 第一种解法
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String a =in.nextLine();
        String b =in.nextLine();
        //遍历输入的第二个字符串
        for(int i = 0;i < b.length();i++){
            //用来记录在第二个字符串中的字符在第一个字符串中出现的位置。
            int index = 0;
            //charAt方法是将第二个字符串i位置的元素取出
            //indexOf方法是将取出的字符在第一个字符串中进行查找,返回第一次在该字符串中出现的下标(索引)
            //取出的字符在第一个字符串中存在,则返回第一次在第一个字符串中出现的位置,如果美欧则返回-1
            //while循环的作用是在新产生的字符串a中继续寻找当前第二个字符串中i下标所指的元素,直到a中没有这个字符,循环结束。也就将a字符串中的这个字符删除完了
            while((index = a.indexOf(b.charAt(i)))!=-1){
            //substring(,)是一个左开右闭的取值玩味,从index位置开始,到end-1的位置
            //返回一个字符串,该字符串是调用这个方法的字符串的子字符串
            //substring()表示从index+1的位置开始到调用这个方法的字符串的末尾,返回一个新的字符串
            //这样就将第二个字符串中的在第一个字符串中出现的字符删除完了,并且通过拼接的方式将字符拼接起来,形成了目标字符串
                a = a.substring(0,index)+a.substring(index+1);
            }
        }
        System.out.println(a);
    }
}
  • 第二种解法
public class Main{    
        public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        String a = in.nextLine();
        String b =in.nextLine();
        //1、创建HashMap,使用K-V模型
        HashMap<Character,Integer> hashMap = new HashMap<>();
        //2、先遍历第二个字符串
        for (int i = 0; i < b.length(); i++) {
            //判断当前遍历到的字符在HashMap中是否存在,判断依据就是这个字符在HashMap中的Value值
            //如果value等于0,则在HashMap中构建这个键(字符)和值(出现次数)
            //如果在HashMap中存在,则对这个字符对应的Value值加一
            //这里只能使用null进行对比,不能使用0,因为value是引用类型的数据
            if(hashMap.get(b.charAt(i))==null){
                hashMap.put(b.charAt(i),1);
            }else{
               hashMap.put(b.charAt(i), hashMap.get(b.charAt(i)+1));
            }
        }
        //定义一个变量用来接收第一个字符串中没有在HashMap中出现的字符
        String str = "";
        for (int i = 0; i < a.length(); i++) {
            //判断遍历到的第一个字符串中的字符是否在HashMap中已经存在,如果没有存在,则直接将这个字符传给str
            if(hashMap.get(b.charAt(i))==null){
                str += a.charAt(i);
            }
        }
        //最终打印str中拼接的字符串
        System.out.println(str);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值