JavaRush /Java Blog /Random-KO /트릭이 포함된 Java 문제: 안녕하세요, 인터뷰입니다!

트릭이 포함된 Java 문제: 안녕하세요, 인터뷰입니다!

Random-KO 그룹에 게시되었습니다
JavaRush 학생 에게는 프로그래밍 과제, Java 및 유효성 검사기가 가장 친한 친구입니다. 그러나 모든 개발자 Padawan에게는 때때로 익숙한 길을 벗어나 자신을 위한 미니 프로젝트를 구상하고 인터뷰를 준비해야 할 때가 있습니다. 인터뷰에서는 코스에서와 똑같은 실제 Java 문제에 직면하게 될 것 같습니다. 대부분의 경우 이는 사실이지만 일부 회사에서는 트릭 질문이나 특이한 질문을 하는 것을 좋아합니다. 스트레스가 많은 인터뷰 중에 혼란을 피하려면 집에서 직접 Java 문제를 해결해 보는 것이 좋습니다.
트릭이 포함된 Java 문제: 안녕하세요, 인터뷰입니다!  - 1
이 기사에서는 이러한 까다로운 작업 중 여섯 가지를 살펴보겠습니다. 먼저 조건을 읽어보시고 직접 해결해 보시는 것을 권장합니다. 그리고 한 가지 더: 매일 강좌에서 Java 문제를 해결하는 것을 잊지 마세요!

Java 문제 - 1: 처음부터 무한 루프 만들기

코드 블록이 주어졌습니다. 루프가 무한해지도록 완료하세요.
class ToInfinity {
    public static void main(String[] args) {

//впишите code сюда

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
“복잡한 건 없어요.”라고 당신은 말합니다. 아마도 당신은 이러한 상황에 한 번 이상 직면했을 것입니다. Java 문제를 해결하는 동안 무한 루프를 생성하고 이를 제거하는 방법에 대해 생각했습니다. 그 반대입니다. 중요한 점은 사이클 자체와 사이클 종료 조건을 변경할 수 없다는 것입니다. 두 번의 반복만 있습니다. 그러나 무한 루프를 만들기에는 충분합니다. 두 번의 반복에 대해서만 작동해야 하는 것처럼 보이지만 오버플로를 사용하면 무한하게 만들 수 있습니다. 이미 어떻게 추측하셨나요?

해결책

오버플로로 인해. Java에 저장할 수 있는 Integer.MAX_VALUE최대값입니다 . int이 값에 도달하여 증가하면 , 즉 최소값 으로 Integer.MAX_VALUE롤다운됩니다 . 따라서 이 Java 문제를 해결하려면 데이터 유형의 최대값보다 1 작은 값을 변수에 할당하면 됩니다 . Java의 작업 코드:Integer.MIN_VALUEIntegerstartint
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 task-2.실행할 코멘트를 작성한다

자, 여기 있습니다! 첫 강의부터 우리는 댓글이 실행되지 않는다는 말을 들었습니다. 그것이 바로 그들이 댓글을 달고 있는 이유입니다. 우리는 이 문제에 대한 해결책이 Java 프로그래머, 심지어 숙련된 프로그래머에게도 항상 명확한 것은 아니라고 생각합니다. 그러나 Java 시스템이 실행을 위해 주석을 "합법적으로" 실행하도록 강제하는 까다로운 방법이 하나 있습니다. 바람이 어디서 불어오는지 느껴지시나요? 맞춰봐!

해결책

Java 문제를 해결하기 위한 코드:
public class ExecutableComment {
    public static void main(String[] args) {
        // комментарий ниже будет выполнен!
        // \u000d System.out.println("выполняемый комментарий");
    }
}
IDE에서 Java로 이 작업에 대한 코드를 입력하면 다음과 같은 결과를 얻게 됩니다.
выполняемый комментарий
그 이유는 Java 컴파일러가 유니코드 문자를 \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" 시리즈의 또 다른 대표자입니다. 이것이 왜 필요한지 명확하지 않다는 점에서 주기가 비인격적이라는 사실로 인해 기분이 상할 가능성은 거의 없습니다. 글쎄요, 또 중요한 것이 있습니다. 언어를 사용하면 사이클에 이름을 지정할 수 있습니다.

해결책

참고: 어떤 사람들에게는 이러한 "이름"을 "태그"라고 부르는데 실제로는 사용하지 않는 것이 좋습니다. 명명된 루프를 보여주는 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
여기서 계속을 사용하여 명명된 루프의 시작 부분으로 이동할 수도 있습니다. 그리고 필요한 경우 중첩된 with 루프에서 break(또는 )를 사용하여 를 사용하는 여러 루프를 분할 할 수 있습니다 . 이렇게 하면 많은 플래그를 설정하고 테스트하여 내부 루프를 계속할지 아니면 종료할지 파악하는 데 도움이 됩니다. continueif-elseforif-elseif-else

Java 문제 - 4. 정수 배열의 유일한 중복 정보

1부터 100까지의 요소를 포함하는 정수 배열(또는 ArrayList선호하는 경우 ) 이 제공됩니다 Integer. 이 배열에는 중복된 요소가 하나만 있습니다. 그것을 찾는 방법? 이러한 작업은 이전 세 가지 작업보다 Java 프로그래머에게 더 친숙합니다. 거의 사용되지 않는 언어의 미묘함을 아는 것이 아니라 논리에 관한 것이기 때문입니다. 무차별 대입으로 해결하려는 첫 번째 억제되지 않은 충동은 머리가 켜지거나 "나는 프로그래머이고 똑똑해요"라는 태도가 있을 때 아주 빨리 사라집니다. 유일한 나쁜 점은 인터뷰 중에 스트레스를 받으면 이런 일이 일어나지 않을 수도 있다는 것입니다. 그러므로 해결책을 찾기 전에 지금 생각해보세요!

솔루션 알고리즘은 다음과 같습니다.

1부터 100까지의 모든 숫자의 합을 계산합니다. (예를 들어 유명한 가우스 방법을 사용하여) 이 작업을 수행하는 방법을 알고 있다고 생각합니다. 이제 배열 요소의 합을 계산합니다 ArrayList’а. 그리고... 두 번째 금액에서 첫 번째 금액을 뺍니다. 빙고! 결과 숫자는 중복 요소의 값입니다. .NET용 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 meaning 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 значениями по принципу:
// ключ – meaning element, meaning – сколько раз он встречается
        elements.forEach(e -> duplicates.put(e, duplicates.get(e) == null ? 1 : duplicates.get(e) + 1));
//из duplicates убираем все элементы, которые встретorсь не более 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의 자료가 사용되었습니다.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION