Для студентів JavaRush завдання з програмування, Java та валідатор - найкращі друзі. Тим не менш, у кожного падавана-розробника настає момент, коли потрібно починати іноді сходити з вторинної доріжки, вигадувати собі міні-проекти та готуватися до співбесід. На інтерв'ю, здавалося б, повинні зустрічатися такі самі практичні завдання з Java, що і в курсі. У більшості випадків так і є, але деякі компанії люблять ставити питання з каверзою або щось незвичне. Щоб не бути спантеличеним в стресовий момент співбесіди, корисно намагатися вирішувати такі Java-завдання самостійно, в домашніх умовах.
У статті ми розглянемо півдесятка таких хитрих завдань. Рекомендуємо спочатку прочитати умову та спробувати вирішити самостійно. І ще: не забувайте вирішувати завдання з Java з курсу кожен день!
- Завдання-1: Створення нескінченного циклу на порожньому місці
- Завдання-2. Створіть коментар, який буде виконуватись
- Завдання-3: створити іменований цикл
- Завдання-4. Про єдиний дублікат у масиві цілих чисел
- Завдання-5. Про не єдиний дублікат у масиві цілих чисел
Завдання з 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);
}
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ