JavaRush /Java блог /Random UA /Java-завдання з каверзою: привіт, співбесіди!

Java-завдання з каверзою: привіт, співбесіди!

Стаття з групи Random UA
Для студентів JavaRush завдання з програмування, Java та валідатор - найкращі друзі. Тим не менш, у кожного падавана-розробника настає момент, коли потрібно починати іноді сходити з вторинної доріжки, вигадувати собі міні-проекти та готуватися до співбесід. На інтерв'ю, здавалося б, повинні зустрічатися такі самі практичні завдання з Java, що і в курсі. У більшості випадків так і є, але деякі компанії люблять ставити питання з каверзою або щось незвичне. Щоб не бути спантеличеним в стресовий момент співбесіди, корисно намагатися вирішувати такі Java-завдання самостійно, в домашніх умовах.
Java-завдання з каверзою: привіт, співбесіди!  - 1
У статті ми розглянемо півдесятка таких хитрих завдань. Рекомендуємо спочатку прочитати умову та спробувати вирішити самостійно. І ще: не забувайте вирішувати завдання з Java з курсу кожен день!

Завдання з Java - 1: Створення нескінченного циклу на порожньому місці

Дано блок коду. Доповніть його так, щоб цикл став нескінченним.
class ToInfinity {
    public static void main(String[] args) {

//впишите код сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
"Нічого складного", - скажете ви. Швидше за все, ви не раз потрапляли в таку історію: вирішуючи завдання з Java, ви створювали нескінченний цикл і думали, як його позбутися. Тут же навпаки. Хитрість у тому, що сам цикл та умови виходу з нього міняти не можна. Є лише дві ітерації. Проте їх цілком достатньо, щоб створити нескінченний цикл. Схоже, що він повинен працювати лише для двох ітерацій, але його можна зробити нескінченним за рахунок використання переповнення. Вже здогадалися, як?

Рішення

За рахунок переповнення. Integer.MAX_VALUE— максимальне значення, яке intможе зберігати Java. Якщо ви досягаєте Integer.MAX_VALUEта інкрементуєте це значення, то скачуєтесь до Integer.MIN_VALUE, тобто до мінімального значення Integer. Таким чином, для вирішення цієї Java-завдання нам достатньо присвоїти змінної startзначення на 1 менше, ніж максимальне для типу даних int. Код завдання на 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); //убеждаемся в бесконечности цикла
        }
    }
}
Що виходить? Ми починаємо з start=2147483645 (Integer.MAX_VALUE-1), на наступній ітерації значення стає 2147483645, потім 2147483646, потім -2147483648, -2147483647… і так далі.

Завдання з Java-2. Створіть коментар, який буде виконуватися

Ну от приїхали! З перших лекцій ми чули про те, що коментарі не виконуються. На те вони й коментарі. Думаємо, вирішення цього завдання для Java-програміста, навіть досвідченого, не завжди очевидне. Проте є один хитрий спосіб, як змусити Java-машину «легально» запустити коментар на виконання. Відчуваєте, звідки вітер дме? Спробуйте припустити!

Рішення

Код розв'язання задачі на Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
Якщо набрати код цього завдання щодо джаву в IDE, ось що ми отримаємо:
выполняемый комментарий
Причина в тому, що компілятор Java зчитує Unicod-символ \u000dяк новий рядок і читає наш код наступним чином: Розшифрований компілятором код вирішення задачі на Java:
public class ExecutableComment {
    public static void main(String[] args) {
        // the line below this gives an output
        // \u000d
        System.out.println("comment executed");
    }
}

Завдання з Java - 3: створити іменований цикл

Ще один представник серії "практичні завдання з програмування, Java у сферичному вакуумі". У тому сенсі, що незрозуміло, навіщо це потрібно, навряд цикл відчуває образу від того, що він обезличений. Ну гаразд, важливо інше: мова дозволяє дати циклу ім'я.

Рішення

Примітка: комусь такі "імена" відомі як "мітки", які не рекомендується використовувати практично. Код вирішення задачі з джава, що демонструє іменований цикл
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);
            }
        }
    }
}
Ось що буде на виході, якщо запустити програму:
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
Тут також можна використовувати continue для початку іменованого циклу. А ще при необхідності вийде використовувати break(або continue) у вкладеному if-elseз forциклом, щоб розбити кілька циклів за допомогою if-else. Це допоможе уникнути встановлення великої кількості прапорів і тестування їх у if-elseщоб зрозуміти, продовжувати чи виходити з внутрішнього циклу.

Завдання по Java - 4. Про єдиний дублікат у масиві цілих чисел

Заданий масив (або ArrayListяк вам більше подобається) цілих чисел, в якому містяться елементи Integerвід 1 до 100. У цьому масиві є один і тільки один продубльований елемент. Як його знайти? Такі завдання для Java-програміста звичніше, ніж попередні три. Тому що вона не про знання тонкощів мови, які майже ніколи не використовуються, а про логіку. Перший неприборканий порив — вирішувати перебором — зникає досить швидко, коли вмикається голова або там установка «я ж програміст, я ж розумний». Погано тільки, що на співбесіді в умовах стресу цього може і не статися. Тож думайте зараз, перш ніж заглядати у рішення!

Алгоритм рішення наступний:

Порахуйте суму всіх чисел від 1 до 100. Думаємо, ви знаєте, як це можна зробити (наприклад, за допомогою знаменитого методу Гаусса). Тепер вважаєте суму елементів вашого масиву або ArrayList’а. І… вичитаєте першу суму з другої. Бінґо! Отримане число - і є значення елемента, що дублюється. Код рішення java-завдання для 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 значення 23
        elements.set(53, 23);
        findDuplicate(elements);
    }
}
Інше рішення
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));
    }
}

Завдання по Java - 5. Про не єдиний дублікат у масиві цілих чисел

Якщо попереднє завдання здалося вам дуже легким, то спробуйте вирішити таку: дано лист цілих чисел від 1 до 100. У ньому є дублікати (більше одного). Як знайти елементи, які зустрічаються більше одного разу (знайти сам елемент та вказати, скільки разів він зустрічається)?

Рішення

Тут логічніше для вирішення використовувати таку структуру, як HashMap, оскільки вона зберігає дані парами «ключ-значення». Код рішення 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 значениями по принципу:
// ключ – значення елемента, значення – сколько раз он встречается
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретабось не более 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);
    }
}

Висновок

Практичні завдання Java бувають дуже різні, і невідомо, яку невідому головоломку вам вирішить підсунути інтерв'юер. Тим не менш, будь-який адекватний роботодавець розуміє, що набагато важливіше уміння вирішувати задачі по Java з підступом буде ваше вміння вирішувати реальні практичні завдання , такі, які вам зустрінуться під час роботи. Тож вирішуйте їх якнайбільше. Для цього і було створено JavaRush. Під час підготовки статті використані матеріали geeksforgeeks
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ