JavaRush /Blog Java /Random-ES /Problemas de Java con un truco: ¡Hola entrevistas!

Problemas de Java con un truco: ¡Hola entrevistas!

Publicado en el grupo Random-ES
Para los estudiantes de JavaRush , los desafíos de programación, Java y el validador son los mejores amigos. Sin embargo, llega un momento para todo desarrollador Padawan en el que a veces necesita empezar a salirse de los caminos trillados, idear miniproyectos para sí mismo y prepararse para las entrevistas. En la entrevista, parecería que deberías encontrar exactamente los mismos problemas prácticos de Java que en el curso. En la mayoría de los casos esto es cierto, pero a algunas empresas les gusta hacer preguntas capciosas o algo inusual. Para evitar confundirse durante una entrevista estresante, es útil intentar resolver estos problemas de Java usted mismo, en casa.
Problemas de Java con un truco: ¡Hola entrevistas!  - 1
En este artículo veremos media docena de estas complicadas tareas. Le recomendamos que primero lea la condición e intente resolverla usted mismo. Y una cosa más: ¡no olvides resolver los problemas de Java del curso todos los días!

Problema de Java - 1: Crear un bucle infinito desde cero

Dado un bloque de código. Complétalo para que el bucle se vuelva infinito.
class ToInfinity {
    public static void main(String[] args) {

//впишите código сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
“Nada complicado”, dices. Lo más probable es que te hayas encontrado en esta situación más de una vez: mientras resolvías problemas de Java, creaste un bucle infinito y pensaste en cómo deshacerte de él. Es al revés. El truco es que el ciclo en sí y las condiciones para salir de él no se pueden cambiar. Sólo hay dos iteraciones. Sin embargo, hay suficientes para crear un bucle infinito. Parece que solo debería funcionar para dos iteraciones, pero se puede hacer infinito usando desbordamiento. ¿Ya has adivinado cómo?

Solución

Por desbordamiento. Integer.MAX_VALUEes el valor máximo que intse puede almacenar en Java. Si alcanza Integer.MAX_VALUEe incrementa este valor, baja hasta Integer.MIN_VALUE, es decir, hasta el valor mínimo Integer. Por lo tanto, para resolver este problema de Java, solo necesitamos asignar un startvalor a la variable que sea 1 menor que el valor máximo para el tipo de datos int. Código de tarea en Java:
class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            //бесконечный цикл
            System.out.println(i); //убеждаемся в бесконечности цикла
        }
    }
}
¿Lo que sucede? Comenzamos con start=2147483645 (Integer.MAX_VALUE-1), en la siguiente iteración el valor pasa a ser 2147483645, luego 2147483646, luego -2147483648, -2147483647... y así sucesivamente.

Tarea Java 2. Crear un comentario que se ejecutará.

¡Bueno aquí estamos! Desde las primeras conferencias escuchamos que los comentarios no se ejecutan. Por eso son comentarios. Creemos que la solución a este problema no siempre es obvia para un programador Java, incluso para uno experimentado. Sin embargo, existe una forma complicada de obligar a la máquina Java a ejecutar "legalmente" un comentario para su ejecución. ¿Sientes de dónde sopla el viento? ¡Intenta adivinar!

Solución

Código para resolver el problema en Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Si escribimos el código para esta tarea en Java en el IDE, esto es lo que obtenemos:
выполняемый комментарий
La razón es que el compilador de Java lee el carácter Unicod \u000dcomo una nueva línea y lee nuestro código de la siguiente manera: El compilador descifró el código para resolver el problema en Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Tarea Java - 3: Crear un bucle con nombre

Otro representante de la serie "Problemas prácticos de programación, Java en un vacío esférico". En el sentido de que no está claro por qué esto es necesario, es poco probable que el ciclo se sienta ofendido por el hecho de que es impersonal. Bueno, está bien, algo más es importante: el lenguaje permite darle un nombre al ciclo.

Solución

Nota: para algunos, estos "nombres" se conocen como "etiquetas", cuyo uso no se recomienda en la práctica. Código para resolver el problema en Java, demostrando un bucle con nombre
public class NamedLoop {
    public static void main(String[] args) {
        loop1:
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 5; j++) {
                if (i == 3)
                    break loop1;
                System.out.println("i = " + i + " j = " + j);
            }
        }
    }
}
Este es el resultado que obtendrá si ejecuta el programa:
i = 0 j = 0
i = 0 j = 1
i = 0 j = 2
i = 0 j = 3
i = 0 j = 4
i = 1 j = 0
i = 1 j = 1
i = 1 j = 2
i = 1 j = 3
i = 1 j = 4
i = 2 j = 0
i = 2 j = 1
i = 2 j = 2
i = 2 j = 3
i = 2 j = 4
Aquí también puedes usar continuar para ir al comienzo de un bucle con nombre. Y si es necesario, puede usar break(o continue) en un bucle if-elsewith foranidado para dividir varios bucles usando if-else. Esto ayudará a evitar configurar muchas banderas y probarlas if-elsepara determinar si continuar o salir del bucle interno.

Problema de Java: 4. Acerca del único duplicado en una matriz de números enteros

Dada una matriz (o ArrayList, como prefiera) de números enteros que contienen elementos Integerdel 1 al 100. Esta matriz tiene uno y solo un elemento duplicado. ¿Cómo encontrarlo? Estas tareas resultan más familiares para un programador de Java que las tres anteriores. Porque no se trata de conocer las sutilezas del lenguaje, que casi nunca se utilizan, sino de lógica. El primer impulso desenfrenado de resolver mediante la fuerza bruta desaparece bastante rápido cuando la cabeza se enciende o surge la actitud de "soy programador, soy inteligente". Lo único malo es que durante una entrevista, bajo estrés, es posible que esto no suceda. ¡Así que piénselo ahora antes de buscar la solución!

El algoritmo de solución es el siguiente:

Calcula la suma de todos los números del 1 al 100. Creemos que sabes cómo hacerlo (por ejemplo, usando el famoso método de Gauss). Ahora calcula la suma de los elementos de tu matriz o ArrayList’а. Y... resta la primera cantidad a la segunda. ¡Bingo! El número resultante es el valor del elemento duplicado. Código de solución de problemas de Java para ArrayList.
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class FindDuplicate {
    private static void findDuplicate(List<Integer> elements) {
//находим сумму всех уникальных элементов списка
        int distinctSum = elements.stream().distinct().mapToInt(e -> e).sum();
//находим сумму всех элементов списка
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("Элемент, который повторяется : " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
//создаем список последовательных элементов на промежутке [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
//устанавливаем элементу с индексом 53 significado 23
        elements.set(53, 23);
        findDuplicate(elements);
    }
}
Otra solución
import java.util.List;
import java.util.ArrayList;

public class Duplicate {

    public int findDuplicateNumber(List<Integer> numbers) {

        int highestNumber = numbers.size() - 1;
        int total = getSum(numbers);
        int duplicate = total - (highestNumber * (highestNumber + 1) / 2);
        return duplicate;
    }

    public int getSum(List<Integer> numbers) {

        int sum = 0;
        for (int num : numbers) {
            sum = sum + num;
        }
        return sum;
    }

    public static void main(String a[]) {
        List <Integer> numbers = new ArrayList <Integer>();
        for (int i = 1; i < 100; i++) {
            numbers.add(i);
        }
        //добавляем дубликат в список
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("Элемент, который повторяется: " + dn.findDuplicateNumber(numbers));
    }
}

Problema de Java: 5. Acerca de un duplicado no único en una matriz de números enteros

Si el problema anterior te pareció demasiado fácil, intenta resolver el siguiente: dada una hoja de números enteros del 1 al 100. Contiene duplicados (más de uno). ¿Cómo encontrar elementos que ocurren más de una vez (buscar el elemento en sí e indicar cuántas veces ocurre)?

Solución

La solución más lógica aquí es utilizar una estructura como HashMap, ya que almacena datos en pares clave-valor. Código para resolver el problema de Java:
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class SomeDuplicates {
    private static void findDuplicates(List<Integer> elements) {
        HashMap <Integer, Integer > duplicates = new HashMap < >();
//заполняем Map duplicates значениями по принципу:
// ключ – significado elemento, significado – сколько раз он встречается
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретoсь не более 1 раза,
//и сохраняем //результат в список (для удобства обработки на следующем шаге)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
//выводим результат для всех элементов в списке result
        result.forEach(e -> System.out.println(String.format("Элемент %d  встречается %d раз", e.getKey(), e.getValue())));
    }

    public static void main(String[] args) {
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
        elements.set(97, 23);
        elements.set(27, 51);
        elements.set(99, 23);
        findDuplicates(elements);
    }
}

Conclusión

Los problemas prácticos de Java son muy diferentes y no sabes qué tipo de acertijo desconocido decidirá darte el entrevistador. Sin embargo, cualquier empleador adecuado comprende que mucho más importante que la capacidad de resolver problemas complicados de Java será su capacidad para resolver problemas prácticos reales , como los que encontrará durante su trabajo. Así que resuélvelos tantos como sea posible. Por eso se creó JavaRush. En la preparación de este artículo se utilizaron materiales de geeksforgeeks .
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION