CodeGym /Java блог /Случаен /Java задачи с обрат: здравейте, интервюта!
John Squirrels
Ниво
San Francisco

Java задачи с обрат: здравейте, интервюта!

Публикувано в групата
Най-добрите приятели на студентите от CodeGym са задачите по програмиране, Java и валидаторът на задачи. И все пак идва време, когато всеки падаван разработчик трябва да започне да се отклонява от утъпкания път, да измисли свои собствени мини-проекти и да се подготви за интервюта. Човек би си помислил, че интервюто ще включва точно същите практически Java задачи, които се намират в този курс. И в повечето случаи е така, но някои компании обичат да задават трикови въпроси or нещо непознато. За да избегнете раздразнение по време на стресиращо интервю, е полезно да се опитате да решите подобни Java задачи сами у дома.
Java задачи с обрат: здравейте, интервюта!  - 1
В тази статия ще разгледаме 5 такива трудни задачи. Препоръчваме ви първо да прочетете условията и да се опитате да ги решите сами. И още нещо: не забравяйте да изпълнявате Java задачи в този курс всеки ден!

Задача 1: Създайте безкраен цикъл от нулата

Предоставен е блок от code. Добавете към него, за да направите цикъла безкраен.

class ToInfinity {
    public static void main(String[] args) {

// Insert code here

        for (int i = start; i <= start + 1; i++) {
             /* This should be an infinite loop, but don't change anything here */
        }
    }
}
Това не е трудно “, казвате вие. Повече от вероятно сте попадали в този сценарий многократно: докато изпълнявате Java задача, създавате безкраен цикъл и трябва да мислите How да се отървете от него. Е, това е обратното. Ето сложната част: не можете да промените самия цикъл or неговите условия за излизане. Има само две итерации. Но те са достатъчни, за да създадат безкраен цикъл. Изглежда, че трябва да се изпълнява само за две итерации, но можете да го направите безкраен с помощта на препълване. Досетихте ли се вече How?

Решение

Поради препълване Integer.MAX_VALUEе максималната стойност, която intможе да съхранява в Java. Ако достигнете Integer.MAX_VALUEи увеличите тази стойност, вие се връщате до Integer.MIN_VALUEor по-скоро до най-ниската възможна Integerстойност. Така, за да изпълним тази Java задача, просто трябва да присвоим 1 по-малко от максималната intстойност на startпроменливата. Java code за тази задача:

class ToInfinity {
    public static void main(String[] args) {
        int start = Integer.MAX_VALUE - 1;
        for (int i = start; i <= start + 1; i++) {
            // Infinite loop
            System.out.println(i); // Be sure we are in an infinite loop
        }
    }
}
Какво става? Започваме със start=2147483645 (Integer.MAX_VALUE-1). При следващата итерация стойността става 2147483645, след това 2147483646, след това -2147483648, -2147483647... и така нататък.

Задача 2: Създаване на изпълним коментар

Е, ето ни! Още от първите уроци чухме, че коментарите не се изпълняват. Затова се наричат ​​коментари. Смятаме, че решението на тази задача не винаги ще бъде очевидно за Java програмистите, дори и за опитните. Въпреки това, има един труден (но "законен") начин да накарате JVM да изпълни коментар. Усещате ли накъде сме се запътor? Опитай се да познаеш!

Решение

Java code за тази задача:

public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
Ако въведем този Java code в IDE, ето Howво ще получим:

executable comment
Това е така, защото компилаторът на Java интерпретира символа Unicode \u000dкато нов ред и чете нашия code по следния начин: Java code за тази задача, Howто се интерпретира от компилатора:

public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

Задача 3: Създаване на именуван цикъл

Ето още един член от поредицата, озаглавена „Практически проблеми с програмирането на Java за сферични крави“. В смисъл, че не е ясно защо това изобщо е необходимо: не е вероятно цикълът да се обиди от факта, че не му е дадено име. Както и да е, важно е поради друга причина: езикът ви позволява да наименувате цикъл.

Решение

Забележка: тези "имена" са известни на някои хора като "етикети" и не се препоръчва да се използват на практика. Java code за демонстриране на именуван цикъл

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);
            }
        }
    }
}
Ето Howво ще бъде изведено, ако стартирате програмата:

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(or continue) във вложен if-elseс forцикъл, за да разбиете няколко цикъла с помощта на if-else. Това ще помогне да се избегне създаването на голям брой флагове и проверката им в израз, if-elseза ​​да се определи дали да продължи or да излезе от вътрешния цикъл.

Задача 4: Намерете единичен дубликат в масив от цели числа

Даден ви е масив с цели числа (or ArrayList, ако предпочитате), който съдържа всеки Integerот 1 до 100. Масивът има един и само един дублиран елемент. Как го намирате? По-често срещано е Java програмист да получи този тип задача, отколкото предишните три. Защото става въпрос за логика, а не за вашите познания за рядко използвани тънкости на езика. Първият ви необуздан импулс да използвате груба сила ще премине доста бързо, когато мозъкът ви се задейства or осъзнаете „Аз съм програмист. Аз съм умен“. Единственият проблем е, че по време на интервю, когато си под стрес, това може да не се случи. Така че помислете сега, преди да погледнете решението!

Ето го алгоритъма

Изчислете сбора на всички числа от 1 до 100. Смятаме, че знаете How можете да направите това (например, като използвате известния метод на Гаус). Сега изчислете сумата на елементите във вашия масив or ArrayList. И... извадете първата сума от втората. Бинго! Полученото число е стойността на дублирания елемент. Java code за тази задача с помощта на 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();
// Find the sum of all list elements
        int totalSum = elements.stream().mapToInt(e -> e).sum();
        System.out.println("The repeated element is: " + (totalSum - distinctSum));
    }

    public static void main(String[] args) {
// Create a list of sequential elements in the interval [1..101).
        List <Integer> elements = IntStream.range(1, 101).boxed().collect(Collectors.toList());
// Add the value 23 at index 53
        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);
        }
        // Add a duplicate to the list
        numbers.add(25);
        Duplicate dn = new Duplicate();
        System.out.println("The repeated element is: " + dn.findDuplicateNumber(numbers));
    }
}

Задача 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 <>();
// Use the following rule to populate the Map duplicates:
// the key is the element value, and the value is the number of times it occurs
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
// Remove any elements that don't occur more than once from the Map duplicates
// and store the result as a list (to make it easy to work with in the next step)
        List <Map.Entry <Integer, Integer> >
        result = duplicates.entrySet().stream().filter(d -> d.getValue() > 1).collect(Collectors.toList());
// Write the results for all elements to the result list
        result.forEach(e -> System.out.println(String.format("Element %d  occurs %d times", 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 задачи и не знаете Howъв вид пъзели ще ви помоли интервюиращият да разрешите. Но всеки разумен работодател разбира, че способността ви да изпълнявате реални практически задачи , като тези, които ще срещнете по време на работа, е много по-важна от способността ви да решавате въпроси с трикове. Така че правете това колкото е възможно повече. Ето защо създадохме CodeGym. За създаването на тази статия е използван материал от geeksforgeeks .
Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION