Questão 1: Competição em equipe
Análise de ideias:
primeiro organize os números de entrada em ordem crescente, e o segundo maior número em cada grupo deve ser o maior possível, então escolha o maior e o segundo maior número após cada agrupamento Os números são agrupados em um grupo. Este método de agrupamento pode garantir que eles sejam classificados em ordem crescente. O segundo maior número em cada grupo é o maior número atrás. Portanto, só precisamos
descobrir o número em cada equipe. O segundo maior número é suficiente, observe os números ordenados:
código:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n*3];
for(int i = 0; i<3*n; i++){
arr[i] = scanner.nextInt();
}
//排序
Arrays.sort(arr);
int mid = 0;
int sum = 0;
for(int i =0; i < n;i++){
mid = arr.length-2*(i+1);
sum+=arr[mid];
}
System.out.println(sum);
}
Este código irá reportar um erro, a razão é que quando o número é muito grande, a soma do tipo int não pode ser completamente salva após o acúmulo, e o número int irá transbordar: Portanto, altere o int para longo
:
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] arr = new int[n*3];
for(int i = 0; i<3*n; i++){
arr[i] = scanner.nextInt();
}
//排序
Arrays.sort(arr);
int mid = 0;
long sum = 0;
for(int i =0; i < n;i++){
mid = arr.length-2*(i+1);
sum+=arr[mid];
}
System.out.println(sum);
}
Pergunta 2: Excluir caracteres públicos
Método 1 Exclusão violenta:
percorra a segunda string (str2) e, se o caractere em str2 existir na primeira string (str1), substitua esse caractere pelos seguintes caracteres para alcançar o efeito da exclusão.
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) {
// 注意 while 处理多个 case
String a = in.nextLine();
char[] chars1 =a.toCharArray();
String b = in.nextLine();
char[] chars2 =b.toCharArray();
int len1 = chars1.length;
int len2 = chars2.length;
for(int j = 0; j < len2;j++){
for(int i = 0; i <len1; i++){
if(chars1[i] == chars2[j]){
for(int k = i;k<len1-1;k++){
//找到相同的字符之后,覆盖
chars1[k] = chars1[k+1];
}
len1--;
}
}
}
a = new String (chars1,0,len1);
System.out.println(a);
}
}
Coisas para prestar atenção:
1. Converta a string em uma matriz de números de caracteres
2. Ao substituir, ele começa a partir do i da segunda camada de loops. Para garantir que o j-ésimo caractere em str2 seja excluído em str1, o terceira camada O loop não pode alterar o valor de i, mas usar outra variável para registrar o valor de i, de modo a garantir que após o i-ésimo valor ser excluído com sucesso, se houver esse caractere i atrás de i, você pode continuar a insira o terceiro O loop de três camadas continua a ser excluído.
3. Depois de entrar no loop da terceira camada, o comprimento de str1 deve ser reduzido em 1 para
excluir violentamente os caracteres a serem movidos, e há vários loops aninhados, a complexidade do tempo é O(N*3), e a eficiência é muito baixa 4. A
cobertura é arr[i] = arr[i+1], então a condição final do loop da terceira camada é str1.length-1, caso contrário, haverá acesso fora dos limites da matriz
Método 2 mapa hash:
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) {
// 注意 while 处理多个 case
String s1 = in.nextLine();
String s2 = in.nextLine();
//创建hashmap
HashMap<Character,Integer> map =new HashMap<>();
//循环遍历第二个字符串,将字符都放进哈希表里
for(int i= 0; i < s2.length();i++){
if(map.get(s2.charAt(i)) == null){
//没有这个字符
map.put(s2.charAt(i),1);
}else{
//有这个字符,value值+1
map.put(s2.charAt(i), map.get(s2.charAt(i)+1));
}
}
//遍历第一个字符串
String s = "";
for(int i= 0; i<s1.length();i++){
if(map.get(s1.charAt(i)) ==null){
//如果map里不存在这个字符,就将这个字符拼接起来
s+=s1.charAt(i);
}
}
System.out.println(s);
}
}