Ir al contenido
wannacode

Ejercicios

Aquí están todos los ejercicios del curso en un solo lugar. Primero 50 ejercicios independientes, desde «Hola, mundo» hasta el camino más corto en una cuadrícula, cada uno con un ejemplo y una solución en Java comprobada con un compilador real. Después, los ejercicios de las lecciones, por módulos: cada uno lleva a la lección que explica lo que necesitas.

50 ejercicios para practicar

  1. 1. Hello World

    Imprime en la consola el texto Hello, World!; el programa no tiene entrada.

    Sin entrada.

    Salida
    Hello, World!

    Lo que necesitas está en la lección: Tu primer programa

    Solución
    public class Main {
    public static void main(String[] args) {
    System.out.println("Hello, World!");
    }
    }
  2. 2. Saluda al usuario

    Lee un nombre de una línea y saluda a la persona por su nombre con la forma «Hola, <nombre>!».

    Entrada
    María
    Salida
    Hola, María!

    Lo que necesitas está en la lección: Entrada y salida

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String name = in.nextLine();
    System.out.println("Hola, " + name + "!");
    }
    }
  3. 3. Imprime la edad

    Lee la edad del usuario (un número entero), guárdala en una variable e imprímela en una frase.

    Entrada
    17
    Salida
    Tienes 17 años.

    Lo que necesitas está en la lección: Variables y tipos

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int age = Integer.parseInt(in.nextLine());
    System.out.println("Tienes " + age + " años.");
    }
    }
  4. 4. Conversor de unidades

    Lee una longitud en pulgadas (puede ser un número decimal) y conviértela a centímetros: 1 pulgada = 2.54 cm. Imprime el resultado con 2 decimales.

    Entrada
    12.5
    Salida
    31.75 cm

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double inches = Double.parseDouble(in.nextLine());
    System.out.printf("%.2f cm%n", inches * 2.54);
    }
    }
  5. 5. Par o impar

    Lee un número entero e imprime si es par o impar.

    Entrada
    7
    Salida
    7 es impar.

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    if (number % 2 == 0) {
    System.out.println(number + " es par.");
    } else {
    System.out.println(number + " es impar.");
    }
    }
    }
  6. 6. Suma de dos números

    Lee dos números enteros, cada uno en su propia línea, e imprime su suma.

    Entrada
    12
    30
    Salida
    La suma es 42.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int first = Integer.parseInt(in.nextLine());
    int second = Integer.parseInt(in.nextLine());
    System.out.println("La suma es " + (first + second) + ".");
    }
    }
  7. 7. Área de un cuadrado

    Lee el lado de un cuadrado (un número entero) e imprime su área.

    Entrada
    5
    Salida
    El área es 25.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int side = Integer.parseInt(in.nextLine());
    System.out.println("El área es " + side * side + ".");
    }
    }
  8. 8. Volumen de una esfera

    Lee el radio r (puede ser un número decimal) e imprime el volumen de la esfera V = 4/3 · π · r³ con 2 decimales.

    Entrada
    3
    Salida
    El volumen es 113.10.

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double r = Double.parseDouble(in.nextLine());
    double volume = 4.0 / 3 * Math.PI * r * r * r;
    System.out.printf("El volumen es %.2f.%n", volume);
    }
    }
  9. 9. Compara dos números

    Lee dos números enteros, cada uno en su propia línea, e imprime el mayor (si son iguales, cualquiera de los dos).

    Entrada
    8
    15
    Salida
    El mayor es 15.

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a = Integer.parseInt(in.nextLine());
    int b = Integer.parseInt(in.nextLine());
    if (a > b) {
    System.out.println("El mayor es " + a + ".");
    } else {
    System.out.println("El mayor es " + b + ".");
    }
    }
    }
  10. 10. ¿Es un triángulo?

    Lee tres números enteros, cada uno en su propia línea, y comprueba si pueden ser los lados de un triángulo: la suma de dos cualesquiera tiene que ser mayor que el tercero.

    Entrada
    3
    4
    5
    Salida
    Pueden formar un triángulo.

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int a = Integer.parseInt(in.nextLine());
    int b = Integer.parseInt(in.nextLine());
    int c = Integer.parseInt(in.nextLine());
    if (a + b > c && a + c > b && b + c > a) {
    System.out.println("Pueden formar un triángulo.");
    } else {
    System.out.println("No pueden formar un triángulo.");
    }
    }
    }
  11. 11. La nota en palabras

    Lee una nota de la escala búlgara del 2 al 6 (puede ser decimal) e imprímela en palabras: desde 5.50 es Excelente, desde 4.50 Muy bien, desde 3.50 Bien, desde 3.00 Suficiente y por debajo de 3.00 Insuficiente.

    Entrada
    4.75
    Salida
    Muy bien

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double grade = Double.parseDouble(in.nextLine());
    if (grade >= 5.5) {
    System.out.println("Excelente");
    } else if (grade >= 4.5) {
    System.out.println("Muy bien");
    } else if (grade >= 3.5) {
    System.out.println("Bien");
    } else if (grade >= 3) {
    System.out.println("Suficiente");
    } else {
    System.out.println("Insuficiente");
    }
    }
    }
  12. 12. De horas a segundos

    Lee un número de horas (un número entero) e imprime cuántos segundos son.

    Entrada
    2
    Salida
    7200 segundos

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int hours = Integer.parseInt(in.nextLine());
    System.out.println(hours * 3600 + " segundos");
    }
    }
  13. 13. Contar hasta N

    Lee un número entero N e imprime los números del 1 al N, cada uno en una línea nueva.

    Entrada
    5
    Salida
    1
    2
    3
    4
    5

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    for (int i = 1; i <= n; i++) {
    System.out.println(i);
    }
    }
    }
  14. 14. Valor ASCII

    Lee un carácter (el primer carácter de la línea) e imprime su código ASCII, es decir, el número con el que la computadora lo guarda.

    Entrada
    A
    Salida
    El código de A es 65.

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    char symbol = in.nextLine().charAt(0);
    System.out.println("El código de " + symbol + " es " + (int) symbol + ".");
    }
    }
  15. 15. Ecuación cuadrática

    Lee a, b y c, cada uno en su propia línea, y resuelve ax² + bx + c = 0. Con dos raíces imprime «x1 = …, x2 = …» (x1 usa +√D), con una raíz «x = …», con 2 decimales; si no hay raíces reales o a es 0, dilo.

    Entrada
    1
    -3
    2
    Salida
    x1 = 2.00, x2 = 1.00

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double a = Double.parseDouble(in.nextLine());
    double b = Double.parseDouble(in.nextLine());
    double c = Double.parseDouble(in.nextLine());
    if (a == 0) {
    System.out.println("No es una ecuación cuadrática");
    } else {
    double d = b * b - 4 * a * c;
    if (d > 0) {
    double x1 = (-b + Math.sqrt(d)) / (2 * a);
    double x2 = (-b - Math.sqrt(d)) / (2 * a);
    System.out.printf("x1 = %.2f, x2 = %.2f%n", x1, x2);
    } else if (d == 0) {
    System.out.printf("x = %.2f%n", -b / (2 * a));
    } else {
    System.out.println("No hay raíces reales");
    }
    }
    }
    }
  16. 16. Positivo o negativo

    Lee un número entero e imprime si es positivo, negativo o cero.

    Entrada
    -4
    Salida
    Negativo

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    if (number > 0) {
    System.out.println("Positivo");
    } else if (number < 0) {
    System.out.println("Negativo");
    } else {
    System.out.println("Cero");
    }
    }
    }
  17. 17. Estaciones

    Lee un número de mes (1–12) e imprime su estación: 12, 1 y 2 son Invierno, 3–5 Primavera, 6–8 Verano y 9–11 Otoño. Para cualquier otro número imprime «Mes no válido».

    Entrada
    4
    Salida
    Primavera

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int month = Integer.parseInt(in.nextLine());
    if (month < 1 || month > 12) {
    System.out.println("Mes no válido");
    } else if (month == 12 || month <= 2) {
    System.out.println("Invierno");
    } else if (month <= 5) {
    System.out.println("Primavera");
    } else if (month <= 8) {
    System.out.println("Verano");
    } else {
    System.out.println("Otoño");
    }
    }
    }
  18. 18. Número al revés

    Lee un número entero positivo e imprime el número con sus cifras en orden inverso: 123 se convierte en 321. Los ceros que quedan delante desaparecen (1200 se convierte en 21). Toma la última cifra con % 10 y quítala dividiendo entre 10.

    Entrada
    9071
    Salida
    1709

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int reversed = 0;
    while (n > 0) {
    reversed = reversed * 10 + n % 10;
    n /= 10;
    }
    System.out.println(reversed);
    }
    }
  19. 19. Conversor de temperatura

    Lee una temperatura en grados Celsius (puede llevar punto decimal) e imprímela en Fahrenheit con dos decimales. La fórmula es F = C * 9 / 5 + 32.

    Entrada
    36.6
    Salida
    97.88 °F

    Lo que necesitas está en la lección: Operadores y aritmética

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    double celsius = Double.parseDouble(in.nextLine());
    double fahrenheit = celsius * 9 / 5 + 32;
    System.out.printf("%.2f °F%n", fahrenheit);
    }
    }
  20. 20. El nombre más largo

    La primera línea tiene la cantidad de nombres n, y cada una de las n líneas siguientes tiene un nombre. Imprime el nombre con más letras y su cantidad entre paréntesis; si dos nombres son igual de largos, imprime el primero de ellos.

    Entrada
    4
    Ana
    Alejandra
    Juan
    Guadalupe
    Salida
    Alejandra (9 letras)

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    String longest = "";
    for (int i = 0; i < n; i++) {
    String name = in.nextLine();
    if (name.length() > longest.length()) {
    longest = name;
    }
    }
    System.out.println(longest + " (" + longest.length() + " letras)");
    }
    }
  21. 21. Contador de palabras

    Lee una línea de texto e imprime cuántas palabras tiene. Las palabras están separadas por uno o más espacios, así que los trozos vacíos entre dos espacios no son palabras.

    Entrada
    Escribo código cada día y mejoro
    Salida
    6

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String line = in.nextLine();
    String[] words = line.trim().split(" +");
    System.out.println(words.length);
    }
    }
  22. 22. Número primo

    Lee un número entero n y comprueba si es primo: mayor que 1 y divisible solo entre 1 y entre sí mismo. Basta con probar los divisores i para los que i * i <= n.

    Entrada
    91
    Salida
    91 no es primo

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    boolean prime = n > 1;
    for (int i = 2; i * i <= n; i++) {
    if (n % i == 0) {
    prime = false;
    break;
    }
    }
    if (prime) {
    System.out.println(n + " es primo");
    } else {
    System.out.println(n + " no es primo");
    }
    }
    }
  23. 23. Día de la semana

    Lee un número del 1 al 7 e imprime el nombre de ese día de la semana, donde 1 es el lunes. Guarda los nombres en un array; para cualquier otro número imprime «No existe ese día».

    Entrada
    5
    Salida
    Viernes

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int day = in.nextInt();
    String[] days = { "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo" };
    if (day >= 1 && day <= 7) {
    System.out.println(days[day - 1]);
    } else {
    System.out.println("No existe ese día");
    }
    }
    }
  24. 24. Factorial

    Lee un número entero n del 0 al 15 e imprime n! = 1 * 2 * ... * n (0! es 1). Ya 13! no cabe en un int, así que en Java y C# guarda el producto en un long.

    Entrada
    15
    Salida
    15! = 1307674368000

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    long factorial = 1;
    for (int i = 2; i <= n; i++) {
    factorial *= i;
    }
    System.out.println(n + "! = " + factorial);
    }
    }
  25. 25. Fecha válida

    Lee un día, un mes y un año, cada uno en su propia línea, e imprime «Fecha válida» o «Fecha no válida». El año es al menos 1, el mes va del 1 al 12 y el día del 1 al número de días de ese mes; febrero tiene 29 días en un año bisiesto (divisible entre 4 pero no entre 100, salvo que sea divisible entre 400).

    Entrada
    29
    2
    2100
    Salida
    Fecha no válida

    Lo que necesitas está en la lección: Condiciones

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int day = in.nextInt();
    int month = in.nextInt();
    int year = in.nextInt();
    boolean leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    int days;
    if (month == 2) {
    days = leap ? 29 : 28;
    } else if (month == 4 || month == 6 || month == 9 || month == 11) {
    days = 30;
    } else {
    days = 31;
    }
    if (year >= 1 && month >= 1 && month <= 12 && day >= 1 && day <= days) {
    System.out.println("Fecha válida");
    } else {
    System.out.println("Fecha no válida");
    }
    }
    }
  26. 26. Frecuencia de letras

    Lee una línea de texto e imprime cuántas veces aparece cada letra en ella, sin distinguir mayúsculas y minúsculas. Imprime las letras en orden alfabético, una por línea, con la forma «a: 5»; los espacios y los signos de puntuación no se cuentan.

    Entrada
    ¡Hola, Mundo!
    Salida
    a: 1
    d: 1
    h: 1
    l: 1
    m: 1
    n: 1
    o: 2
    u: 1

    Lo que necesitas está en la lección: HashMap y HashSet

    Solución
    import java.util.Map;
    import java.util.Scanner;
    import java.util.TreeMap;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine().toLowerCase();
    Map<Character, Integer> counts = new TreeMap<>();
    for (char c : text.toCharArray()) {
    if (Character.isLetter(c)) {
    counts.put(c, counts.getOrDefault(c, 0) + 1);
    }
    }
    for (char c : counts.keySet()) {
    System.out.println(c + ": " + counts.get(c));
    }
    }
    }
  27. 27. Mínimo y máximo en un array

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Léelos en un array e imprime el menor y el mayor, empezando por el primer elemento y comparándolo con los demás.

    Entrada
    5
    7
    -3
    12
    0
    4
    Salida
    Mínimo: -3
    Máximo: 12

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    int min = numbers[0];
    int max = numbers[0];
    for (int i = 1; i < n; i++) {
    if (numbers[i] < min) {
    min = numbers[i];
    }
    if (numbers[i] > max) {
    max = numbers[i];
    }
    }
    System.out.println("Mínimo: " + min);
    System.out.println("Máximo: " + max);
    }
    }
  28. 28. Ordenar un array

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Ordénalos tú mismo de menor a mayor con el método de la burbuja (n - 1 pasadas; en cada una intercambias los vecinos que están en el orden equivocado) e imprímelos en una línea, separados por espacios.

    Entrada
    6
    5
    2
    9
    1
    5
    6
    Salida
    1 2 5 5 6 9

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    for (int pass = 0; pass < n - 1; pass++) {
    for (int i = 0; i < n - 1 - pass; i++) {
    if (numbers[i] > numbers[i + 1]) {
    int temp = numbers[i];
    numbers[i] = numbers[i + 1];
    numbers[i + 1] = temp;
    }
    }
    }
    for (int i = 0; i < n; i++) {
    if (i > 0) {
    System.out.print(" ");
    }
    System.out.print(numbers[i]);
    }
    System.out.println();
    }
    }
  29. 29. Reemplazar las vocales

    Lee una línea de texto e imprímela con cada vocal, mayúscula o minúscula, reemplazada por el carácter *. Las vocales son a, e, i, o, u, también con tilde (á, é, í, ó, ú).

    Entrada
    Me encanta programar
    Salida
    M* *nc*nt* pr*gr*m*r

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String vowels = "aeiouáéíóú";
    String result = "";
    for (char c : text.toCharArray()) {
    if (vowels.indexOf(Character.toLowerCase(c)) >= 0) {
    result += "*";
    } else {
    result += c;
    }
    }
    System.out.println(result);
    }
    }
  30. 30. Suma de las cifras

    Lee un número entero no negativo e imprime la suma de sus cifras. La última cifra es n % 10, y n / 10 la quita (n // 10 en Python).

    Entrada
    9875
    Salida
    29

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int sum = 0;
    while (n > 0) {
    sum += n % 10;
    n /= 10;
    }
    System.out.println(sum);
    }
    }
  31. 31. Palíndromo

    Lee una línea de texto y comprueba si es un palíndromo, es decir, si se lee igual al revés. Las mayúsculas y las minúsculas cuentan como iguales y los espacios se saltan. Imprime «Palíndromo» o «No es palíndromo».

    Entrada
    Anita lava la tina
    Salida
    Palíndromo

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine().toLowerCase().replace(" ", "");
    boolean palindrome = true;
    for (int i = 0; i < text.length() / 2; i++) {
    if (text.charAt(i) != text.charAt(text.length() - 1 - i)) {
    palindrome = false;
    break;
    }
    }
    if (palindrome) {
    System.out.println("Palíndromo");
    } else {
    System.out.println("No es palíndromo");
    }
    }
    }
  32. 32. Contraseña segura

    Lee contraseñas, una por línea, hasta que llegue una segura: al menos 8 caracteres, al menos una cifra, una letra mayúscula y una minúscula. Para cada contraseña débil imprime la primera regla que no cumple, en este orden («Demasiado corta», «Sin cifra», «Sin mayúscula», «Sin minúscula»); para la segura imprime «Contraseña aceptada» y detente.

    Entrada
    kotka
    kotkamiau
    kotkamiau7
    Kotkamiau7
    Salida
    Demasiado corta
    Sin cifra
    Sin mayúscula
    Contraseña aceptada

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    while (true) {
    String password = in.nextLine();
    boolean digit = false;
    boolean upper = false;
    boolean lower = false;
    for (char c : password.toCharArray()) {
    if (Character.isDigit(c)) {
    digit = true;
    } else if (Character.isUpperCase(c)) {
    upper = true;
    } else if (Character.isLowerCase(c)) {
    lower = true;
    }
    }
    if (password.length() < 8) {
    System.out.println("Demasiado corta");
    } else if (!digit) {
    System.out.println("Sin cifra");
    } else if (!upper) {
    System.out.println("Sin mayúscula");
    } else if (!lower) {
    System.out.println("Sin minúscula");
    } else {
    System.out.println("Contraseña aceptada");
    break;
    }
    }
    }
    }
  33. 33. Array al revés

    La primera línea tiene la cantidad n, y cada una de las n líneas siguientes tiene un número entero. Léelos en un array e imprímelos en orden inverso en una línea, separados por espacios: recorre el array desde el último índice hasta el cero.

    Entrada
    4
    10
    -2
    7
    3
    Salida
    3 7 -2 10

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = in.nextInt();
    int[] numbers = new int[n];
    for (int i = 0; i < n; i++) {
    numbers[i] = in.nextInt();
    }
    for (int i = n - 1; i >= 0; i--) {
    System.out.print(numbers[i]);
    if (i > 0) {
    System.out.print(" ");
    }
    }
    System.out.println();
    }
    }
  34. 34. Contar los elementos

    Lee una línea de palabras separadas por un solo espacio e imprime cuántas veces aparece cada palabra, con la forma «palabra: cantidad». Las palabras salen en el orden en que aparecieron por primera vez.

    Entrada
    manzana pera manzana ciruela pera manzana
    Salida
    manzana: 3
    pera: 2
    ciruela: 1

    Lo que necesitas está en la lección: HashMap y HashSet

    Solución
    import java.util.LinkedHashMap;
    import java.util.Map;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String line = in.nextLine();
    Map<String, Integer> counts = new LinkedHashMap<>();
    for (String word : line.split(" ")) {
    counts.put(word, counts.getOrDefault(word, 0) + 1);
    }
    for (String word : counts.keySet()) {
    System.out.println(word + ": " + counts.get(word));
    }
    }
    }
  35. 35. Números primos

    Lee un número N e imprime en una línea, separados por espacios, todos los números primos del 2 al N.

    Entrada
    30
    Salida
    2 3 5 7 11 13 17 19 23 29

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    String result = "";
    for (int i = 2; i <= n; i++) {
    boolean prime = true;
    for (int d = 2; d * d <= i; d++) {
    if (i % d == 0) {
    prime = false;
    break;
    }
    }
    if (prime) {
    result += i + " ";
    }
    }
    System.out.println(result.trim());
    }
    }
  36. 36. Media

    Una línea tiene números enteros separados por espacios. Imprime su media con dos decimales.

    Entrada
    5 8 12 6
    Salida
    Media: 7.75

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int sum = 0;
    for (int i = 0; i < parts.length; i++) {
    sum += Integer.parseInt(parts[i]);
    }
    double average = (double) sum / parts.length;
    System.out.printf("Media: %.2f%n", average);
    }
    }
  37. 37. Ordenar por longitud

    Una línea tiene palabras separadas por espacios. Ordénalas por longitud, de la más corta a la más larga (las palabras de igual longitud mantienen el orden de la entrada), e imprímelas en una línea.

    Entrada
    cereza higo banana kiwi ciruela
    Salida
    higo kiwi cereza banana ciruela

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] words = in.nextLine().split(" ");
    for (int i = 0; i < words.length - 1; i++) {
    for (int j = 0; j < words.length - 1 - i; j++) {
    if (words[j].length() > words[j + 1].length()) {
    String temp = words[j];
    words[j] = words[j + 1];
    words[j + 1] = temp;
    }
    }
    }
    System.out.println(String.join(" ", words));
    }
    }
  38. 38. Contador de oraciones

    Lee una línea de texto e imprime cuántas oraciones tiene. Una oración termina con un punto, un signo de exclamación o un signo de interrogación; una serie de esos signos (como «...» o «?!») es un solo final.

    Entrada
    ¡Hola! ¿Cómo estás? Estoy bien... ¿Y tú?!
    Salida
    Oraciones: 4

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String ends = ".!?";
    int count = 0;
    for (int i = 0; i < text.length(); i++) {
    boolean isEnd = ends.indexOf(text.charAt(i)) >= 0;
    boolean nextIsEnd = i + 1 < text.length() && ends.indexOf(text.charAt(i + 1)) >= 0;
    if (isEnd && !nextIsEnd) {
    count++;
    }
    }
    System.out.println("Oraciones: " + count);
    }
    }
  39. 39. Números de Fibonacci

    La sucesión de Fibonacci empieza con 1, 1, y cada número siguiente es la suma de los dos anteriores. Lee N (del 1 al 50) e imprime el N-ésimo número de la sucesión.

    Entrada
    40
    Salida
    102334155

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int n = Integer.parseInt(in.nextLine());
    long previous = 0;
    long current = 1;
    for (int i = 1; i < n; i++) {
    long next = previous + current;
    previous = current;
    current = next;
    }
    System.out.println(current);
    }
    }
  40. 40. Calcular la mediana

    Una línea tiene números enteros separados por espacios. Imprime su mediana con un decimal: el número del medio una vez ordenados, o la media de los dos del medio cuando la cantidad es par.

    Entrada
    12 3 7 9 1 8
    Salida
    Mediana: 7.5

    Lo que necesitas está en la lección: Listas

    Solución
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    List<Integer> numbers = new ArrayList<>();
    for (String part : in.nextLine().split(" ")) {
    numbers.add(Integer.parseInt(part));
    }
    Collections.sort(numbers);
    int n = numbers.size();
    double median;
    if (n % 2 == 1) {
    median = numbers.get(n / 2);
    } else {
    median = (numbers.get(n / 2 - 1) + numbers.get(n / 2)) / 2.0;
    }
    System.out.printf("Mediana: %.1f%n", median);
    }
    }
  41. 41. Gráfico de caracteres

    Lee una línea de texto. Para cada carácter que no sea el espacio, en el orden en que aparece por primera vez, imprime una línea «carácter | estrellas» con una estrella por cada vez que aparece en el texto.

    Entrada
    pan de banana
    Salida
    p | *
    a | ****
    n | ***
    d | *
    e | *
    b | *

    Lo que necesitas está en la lección: Cadenas: trabajar con texto

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if (c != ' ' && text.indexOf(c) == i) {
    int count = 0;
    for (int j = 0; j < text.length(); j++) {
    if (text.charAt(j) == c) {
    count++;
    }
    }
    System.out.println(c + " | " + "*".repeat(count));
    }
    }
    }
    }
  42. 42. Trasponer una matriz

    La primera línea tiene el número de filas R y de columnas C, y le siguen R líneas con C números separados por espacios. Imprime la matriz traspuesta: C líneas con R números, donde las filas pasan a ser columnas.

    Entrada
    2 3
    1 2 3
    4 5 6
    Salida
    1 4
    2 5
    3 6

    Lo que necesitas está en la lección: Arrays bidimensionales

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    int cols = Integer.parseInt(size[1]);
    int[][] matrix = new int[rows][cols];
    for (int r = 0; r < rows; r++) {
    String[] parts = in.nextLine().split(" ");
    for (int c = 0; c < cols; c++) {
    matrix[r][c] = Integer.parseInt(parts[c]);
    }
    }
    for (int c = 0; c < cols; c++) {
    String line = "";
    for (int r = 0; r < rows; r++) {
    line += matrix[r][c] + " ";
    }
    System.out.println(line.trim());
    }
    }
    }
  43. 43. Caminos en un laberinto

    La primera línea tiene R y C, y le siguen R líneas de C caracteres: «.» es una celda libre y «#» es una pared. Moviéndote solo a la derecha o hacia abajo y sin pisar nunca una pared, imprime el número de todos los caminos desde la esquina superior izquierda hasta la inferior derecha.

    Entrada
    4 5
    .....
    .#.#.
    ...#.
    #....
    Salida
    Caminos: 4

    Lo que necesitas está en la lección: Recursión

    Solución
    import java.util.Scanner;
    public class Main {
    static int countPaths(String[] maze, int r, int c) {
    if (r >= maze.length || c >= maze[0].length() || maze[r].charAt(c) == '#') {
    return 0;
    }
    if (r == maze.length - 1 && c == maze[0].length() - 1) {
    return 1;
    }
    return countPaths(maze, r + 1, c) + countPaths(maze, r, c + 1);
    }
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    String[] maze = new String[rows];
    for (int r = 0; r < rows; r++) {
    maze[r] = in.nextLine();
    }
    System.out.println("Caminos: " + countPaths(maze, 0, 0));
    }
    }
  44. 44. Estadística de notas

    Una línea tiene notas del 2 al 6 (la escala escolar búlgara, 6 es la mejor), separadas por espacios. Imprime cuántas son excelentes, muy bien, bien, suficientes e insuficientes, cada categoría en su propia línea.

    Entrada
    6 4 5 6 3 5 2 6 5 4
    Salida
    Excelente (6): 3
    Muy bien (5): 3
    Bien (4): 2
    Suficiente (3): 1
    Insuficiente (2): 1

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] names = { "", "", "Insuficiente", "Suficiente", "Bien", "Muy bien", "Excelente" };
    int[] counts = new int[7];
    String[] parts = in.nextLine().split(" ");
    for (int i = 0; i < parts.length; i++) {
    counts[Integer.parseInt(parts[i])]++;
    }
    for (int grade = 6; grade >= 2; grade--) {
    System.out.println(names[grade] + " (" + grade + "): " + counts[grade]);
    }
    }
    }
  45. 45. Números romanos

    Lee un número entero del 1 al 3999 e imprímelo en números romanos (I, V, X, L, C, D, M, donde 4 es IV, 9 es IX, 40 es XL, etc.).

    Entrada
    1994
    Salida
    MCMXCIV

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int number = Integer.parseInt(in.nextLine());
    int[] values = { 1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1 };
    String[] symbols = { "M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I" };
    String roman = "";
    for (int i = 0; i < values.length; i++) {
    while (number >= values[i]) {
    roman += symbols[i];
    number -= values[i];
    }
    }
    System.out.println(roman);
    }
    }
  46. 46. Simulación de una moneda

    Lee una semilla x (del 1 al 2147483646) y un número de lanzamientos N, cada uno en su propia línea. En cada lanzamiento haz x = x * 16807 % 2147483647; un x par es cara (C) y un x impar es cruz (X). Imprime los lanzamientos en una línea y después cuántas veces salió cara y cuántas cruz.

    Entrada
    42
    10
    Salida
    CXXXCXXCCX
    Cara: 4
    Cruz: 6

    Lo que necesitas está en la lección: Bucles

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    long x = Long.parseLong(in.nextLine());
    int n = Integer.parseInt(in.nextLine());
    String tosses = "";
    int heads = 0;
    for (int i = 0; i < n; i++) {
    x = x * 16807 % 2147483647;
    if (x % 2 == 0) {
    tosses += "C";
    heads++;
    } else {
    tosses += "X";
    }
    }
    System.out.println(tosses);
    System.out.println("Cara: " + heads);
    System.out.println("Cruz: " + (n - heads));
    }
    }
  47. 47. Array simétrico

    Una línea tiene números enteros separados por espacios. Comprueba si el array es simétrico, es decir, si se lee igual de izquierda a derecha y de derecha a izquierda.

    Entrada
    1 2 3 2 1
    Salida
    Simétrico

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int[] numbers = new int[parts.length];
    for (int i = 0; i < parts.length; i++) {
    numbers[i] = Integer.parseInt(parts[i]);
    }
    boolean symmetric = true;
    for (int i = 0; i < numbers.length / 2; i++) {
    if (numbers[i] != numbers[numbers.length - 1 - i]) {
    symmetric = false;
    break;
    }
    }
    System.out.println(symmetric ? "Simétrico" : "No simétrico");
    }
    }
  48. 48. Paréntesis equilibrados

    Lee una línea de texto y comprueba si sus paréntesis (), [] y {} están equilibrados: cada uno que abre tiene uno que cierra del mismo tipo y los pares no se cruzan. Los demás caracteres no cuentan.

    Entrada
    (a + [b) * c]
    Salida
    No equilibrados

    Lo que necesitas está en la lección: Pila, cola y lista enlazada

    Solución
    import java.util.ArrayDeque;
    import java.util.Deque;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String text = in.nextLine();
    String opening = "([{";
    String closing = ")]}";
    Deque<Character> stack = new ArrayDeque<>();
    boolean balanced = true;
    for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if (opening.indexOf(c) >= 0) {
    stack.push(c);
    } else if (closing.indexOf(c) >= 0) {
    if (stack.isEmpty() || opening.indexOf(stack.pop()) != closing.indexOf(c)) {
    balanced = false;
    break;
    }
    }
    }
    if (balanced && stack.isEmpty()) {
    System.out.println("Equilibrados");
    } else {
    System.out.println("No equilibrados");
    }
    }
    }
  49. 49. Serie de elementos iguales

    Una línea tiene números enteros separados por espacios. Encuentra la serie más larga de números vecinos iguales e imprímela en una línea; si varias series tienen la misma longitud, imprime la primera.

    Entrada
    2 1 1 3 3 3 2 2 2 5
    Salida
    3 3 3

    Lo que necesitas está en la lección: Arrays

    Solución
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] parts = in.nextLine().split(" ");
    int[] numbers = new int[parts.length];
    for (int i = 0; i < parts.length; i++) {
    numbers[i] = Integer.parseInt(parts[i]);
    }
    int bestValue = numbers[0];
    int bestLength = 1;
    int length = 1;
    for (int i = 1; i < numbers.length; i++) {
    if (numbers[i] == numbers[i - 1]) {
    length++;
    } else {
    length = 1;
    }
    if (length > bestLength) {
    bestLength = length;
    bestValue = numbers[i];
    }
    }
    String result = "";
    for (int i = 0; i < bestLength; i++) {
    result += bestValue + " ";
    }
    System.out.println(result.trim());
    }
    }
  50. 50. Camino más corto en una cuadrícula

    La primera línea tiene R y C, y le siguen R líneas de C caracteres: «.» es una celda libre, «#» es una pared, «S» es el inicio y «E» es la meta. Moviéndote hacia arriba, abajo, izquierda y derecha, imprime el menor número de movimientos de S a E, o «No hay camino» si E no se puede alcanzar.

    Entrada
    5 6
    S.#...
    .##.#.
    ...#..
    #.#..#
    ...E.#
    Salida
    7

    Lo que necesitas está en la lección: Pila, cola y lista enlazada

    Solución
    import java.util.ArrayDeque;
    import java.util.Queue;
    import java.util.Scanner;
    public class Main {
    public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    String[] size = in.nextLine().split(" ");
    int rows = Integer.parseInt(size[0]);
    int cols = Integer.parseInt(size[1]);
    String[] grid = new String[rows];
    for (int r = 0; r < rows; r++) {
    grid[r] = in.nextLine();
    }
    int[][] dist = new int[rows][cols];
    Queue<int[]> queue = new ArrayDeque<>();
    for (int r = 0; r < rows; r++) {
    for (int c = 0; c < cols; c++) {
    dist[r][c] = -1;
    if (grid[r].charAt(c) == 'S') {
    dist[r][c] = 0;
    queue.add(new int[] { r, c });
    }
    }
    }
    int[] dr = { -1, 1, 0, 0 };
    int[] dc = { 0, 0, -1, 1 };
    String answer = "No hay camino";
    while (!queue.isEmpty()) {
    int[] cell = queue.poll();
    int r = cell[0];
    int c = cell[1];
    if (grid[r].charAt(c) == 'E') {
    answer = String.valueOf(dist[r][c]);
    break;
    }
    for (int d = 0; d < 4; d++) {
    int nr = r + dr[d];
    int nc = c + dc[d];
    if (nr >= 0 && nr < rows && nc >= 0 && nc < cols && grid[nr].charAt(nc) != '#' && dist[nr][nc] == -1) {
    dist[nr][nc] = dist[r][c] + 1;
    queue.add(new int[] { nr, nc });
    }
    }
    }
    System.out.println(answer);
    }
    }

Ejercicios de las lecciones

Sección «Ejercicios de las lecciones»

Fundamentos del lenguaje

Métodos

Clases y objetos

Herencia y polimorfismo

Errores y excepciones

Texto y archivos

  • Cadenas: Palíndromo · Un recibo con columnas · Palabras al revés
  • Expresiones regulares: Fecha · Número de móvil · Email · Lista de la compra
  • Expresiones regulares: grupos y reemplazo: Buscar y reemplazar · Palabras con prefijo · Direcciones en un texto · Fechas a ISO
  • Archivos: Un archivo de configuración · Un filtro de archivo de registro · El contenido de una carpeta · Un archivo índice
  • Datos en archivos: Análisis de un CSV · Guardar al héroe · Texto duplicado

Colecciones

  • Listas: Una estantería · Un registro de eventos · Un cuaderno · Cálculo mental
  • Pila, cola y lista enlazada: Un tren de juguete · Una línea de autobús · Un indicador de bolsa · Paréntesis equilibrados · Tu propia lista enlazada
  • HashMap y HashSet: Una tabla de usuarios · Frecuencia de palabras · Documentos por palabra clave · Una red de contactos
  • Códigos hash y funciones hash: Un código hash para una persona · El robot del almacén · El hash de un archivo
  • Clases anidadas: Carrito de compras · Monitor de un servidor web · Administrador de un edificio · Clasificación

Java moderno

  • Lambdas: Ordenar por varios campos · Filtrar pedidos · Descuentos uno tras otro
  • Streams: Ventas por categoría · Los 3 mejores productos · Nota media · Las palabras de un texto
  • record, switch y patrones: Figuras · Precio del envío · Un punto como clave
  • Patrones de diseño: Descuentos como estrategias · «Avísame cuando haya stock» · Una fábrica de notificaciones · Un termómetro antiguo

Programas en el mundo real

  • Tests con JUnit: La calculadora de descuentos · La cuenta · El error en la nota media
  • Hilos: Suma en paralelo · Descarga con un grupo · Un contador sin pérdidas
  • Programación en red: Servidor de eco · Un servidor con comandos · Un chat para dos
  • Bases de datos: Catálogo · Búsqueda por parte del nombre · Una transferencia que falla a medias
  • Reflexión y anotaciones: Todos los campos · Mini JSON · Tu propio ejecutor de pruebas

Hagamos un juego

Las crónicas de Arcanum

Epic Cosmos: el imperio

Proyecto

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·