Prática de teste escrito: dia 1

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
insira a descrição da imagem aqui
descobrir o número em cada equipe. O segundo maior número é suficiente, observe os números ordenados:
insira a descrição da imagem aqui
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
insira a descrição da imagem aqui
:

  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);


    }

insira a descrição da imagem aqui
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.

insira a descrição da imagem aqui

 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:
insira a descrição da imagem aqui

 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);
    }
}

insira a descrição da imagem aqui

Acho que você gosta

Origin blog.csdn.net/m0_62160964/article/details/127460340
Recomendado
Clasificación