目录
一、组队竞赛
【题目描述】
【题目解析】
这个题的只要思路就是贪心算法,队伍中第二高的水平值等于队伍的水平值,为了让所有的队伍的水平值总和达到最大。也就是说让每个队伍中的第二大值尽可能的大。
【解题思路】
贪心算法就是每次选值时都选但概念看到的局部最优解,这里的贪心就是保证每组的第二个取值能够选择的尽可能的大就行。
这里我们将输入的数据从小到大进行排序,分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循环遍历第二个字符串中的字符,于第一个字符串中的字符进行对比,如果在第一个中存在,则记录第一次在第一个字符串中出现的位置。将这个位置之前的字符串和这个位置之后的字符串拼接起来,在新的字符串中就实现了将这个字符删除的功能。
- charAt方法作用就是将指定位置的元素取出。
- indexOf方法的作用就是对比找到这个字符的位置,找到了返回这个字符第一次出现的位置,没有找到返回-1.
- substring方法这里使用了两种,一个是带两个参数的,表示的意思就是返回当前字符串从index位置开始,到end-1的位置结束的字符串;带一个参数的表示的意思是,返回从当前字符串index位置开始,到字符串结尾位置的字符串。
第二种解法就是使用HashMap的思路。
使用HashMap的K-V模型来解决,K表示字符,V表示字符出现的次数。他是一个数组加链表的结构。先遍历第二个字符,将其中的字符全部放入HashMap中,出现一次V表示的次数加一。然后再遍历第一个字符串,将HashMap中没有的字符用str变量接收,拼装,最后将str中的字符串打印。
- put(K,V)方法:表示向HashMap中放入数据,设置key以及对应的value
- 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);
}
}