Práctica de prueba escrita: día 1

Pregunta 1: Competencia en equipo
Análisis de ideas:
primero organice los números de entrada en orden ascendente, y el segundo número más grande de cada grupo debe ser lo más grande posible, así que elija el número más grande y el segundo más grande después de cada agrupación Los números se agrupan en uno grupo. Este método de agrupación puede garantizar que estén ordenados en orden ascendente. El segundo número más grande en cada grupo es el número más grande en la parte posterior. Por lo tanto, solo necesitamos
inserte la descripción de la imagen aquí
averiguar el número en cada equipo. El segundo número más grande es suficiente, observe los números ordenados:
inserte la descripción de la imagen aquí
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 informará un error. La razón es que cuando el número es demasiado grande, la suma del tipo int no se puede guardar por completo después de la acumulación y el número int se desbordará: por lo tanto, cambie el int a largo
inserte la descripción de la imagen aquí
:

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


    }

inserte la descripción de la imagen aquí
Pregunta 2: Eliminar caracteres públicos
Método 1 Eliminación violenta:
recorra la segunda cadena (str2), y si el carácter en str2 existe en la primera cadena (str1), sobrescriba este carácter con los siguientes caracteres para alcanzar El efecto de eliminación.

inserte la descripción de la imagen aquí

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

Cosas a las que prestar atención:
1. Convierta la cadena en una matriz de números de caracteres
2. Al sobrescribir, comience desde la i de la segunda capa de bucle. Para garantizar que el carácter j en str2 se elimine en str1, el tercera capa El bucle no puede cambiar el valor de i, pero usa otra variable para registrar el valor de i, a fin de garantizar que después de que el i-ésimo valor se elimine con éxito, si hay este carácter i detrás de i, puede continuar ingrese el tercer bucle de tres capas continúa eliminando
3. Después de ingresar al bucle de tercera capa, la longitud de str1 debe reducirse en 1 para
eliminar violentamente los caracteres que se van a mover, y hay múltiples bucles anidados, la complejidad del tiempo es O (N * 3) y la eficiencia es demasiado baja 4. La
cobertura es arr [i] = arr [i + 1], por lo que la condición final del bucle de la tercera capa es str1.length-1, de lo contrario habrá acceso fuera de límites de la matriz

Mapa hash del método 2:
inserte la descripción de la imagen aquí

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

inserte la descripción de la imagen aquí

Supongo que te gusta

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