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.
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!
- Tarea 1: Crear un bucle infinito desde cero
- Tarea 2. Crea un comentario que será ejecutado.
- Tarea 3: crear un bucle con nombre
- Tarea-4. Acerca de un único duplicado en una matriz de números enteros
- Tarea-5. Acerca de un duplicado no único en una matriz de números enteros
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_VALUE
es el valor máximo que int
se puede almacenar en Java. Si alcanza Integer.MAX_VALUE
e 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 start
valor 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 \u000d
como 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 nombrepublic 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-else
with for
anidado para dividir varios bucles usando if-else
. Esto ayudará a evitar configurar muchas banderas y probarlas if-else
para 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 (oArrayList
, como prefiera) de números enteros que contienen elementos Integer
del 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 oArrayList’а
. 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 comoHashMap
, 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);
}
}
GO TO FULL VERSION