CodeGym/Java Blog/무작위의/트위스트가 있는 Java 작업: 안녕하세요, 인터뷰입니다!
John Squirrels
레벨 41
San Francisco

트위스트가 있는 Java 작업: 안녕하세요, 인터뷰입니다!

무작위의 그룹에 게시되었습니다
회원
CodeGym 학생들의 가장 친한 친구는 프로그래밍 작업, Java 및 작업 유효성 검사기입니다. 그럼에도 불구하고 모든 padawan 개발자는 익숙한 길을 벗어나 자신만의 미니 프로젝트를 발명하고 인터뷰를 준비해야 할 때가 옵니다. 인터뷰가 이 과정에서 발견되는 것과 정확히 동일한 실용적인 Java 작업을 가질 것이라고 생각할 수도 있습니다. 그리고 대부분의 경우가 그렇긴 한데, 일부 회사에서는 속임수를 쓰거나 생소한 질문을 하는 것을 좋아합니다. 스트레스가 많은 인터뷰 중에 흔들리지 않으려면 집에서 비슷한 Java 작업을 스스로 해결해 보는 것이 좋습니다.
트위스트가 있는 Java 작업: 안녕하세요, 인터뷰입니다!  - 1
이 기사에서는 이러한 까다로운 작업 5가지를 살펴보겠습니다. 먼저 조건을 읽고 직접 해결해 보는 것이 좋습니다. 그리고 한 가지 더: 이 과정에서 매일 Java 작업을 수행하는 것을 잊지 마십시오!

작업 1: 처음부터 무한 루프 만들기

코드 블록이 제공되었습니다. 루프를 무한대로 만들기 위해 추가하십시오.
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 작업을 완료하는 동안 무한 루프를 생성하고 이를 제거하는 방법에 대해 생각해야 했습니다. 글쎄, 이것은 그 반대입니다. 까다로운 부분이 있습니다. 루프 자체나 종료 조건을 변경할 수 없습니다. 반복은 두 번뿐입니다. 그러나 무한 루프를 만들기에는 충분합니다. 두 번의 반복만 실행해야 하는 것처럼 보이지만 오버플로를 사용하여 무한대로 만들 수 있습니다. 방법을 이미 짐작하셨습니까?

해결책

오버플로로 인해 Java에 저장할 수 Integer.MAX_VALUE있는 최대 값입니다 . int이 값에 도달 Integer.MAX_VALUE하고 증가시키면 로 롤백하거나 Integer.MIN_VALUE가능한 가장 낮은 Integer값으로 롤백합니다. int따라서 이 Java 작업을 완료하려면 변수 에 최대값보다 1 작은 값을 할당하면 됩니다 start. 이 작업에 대한 Java 코드:
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이 주석을 실행하도록 하는 까다로운(하지만 "합법적인") 방법이 있습니다. 우리가 어디로 향하고 있는지 알 수 있습니까? 맞춰봐!

해결책

이 작업에 대한 Java 코드:
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d System.out.println("executable comment");
    }
}
이 Java 코드를 IDE에 입력하면 다음과 같은 결과를 얻을 수 있습니다.
executable comment
이는 Java 컴파일러가 유니코드 문자를 \u000d새 줄로 해석하고 코드를 다음과 같이 읽기 때문입니다 . 이 작업에 대한 Java 코드는 컴파일러에서 해석한 대로입니다.
public class ExecutableComment {
    public static void main(String[] args) {
        // The comment below will be executed!
        // \u000d
        System.out.println("comment executed");
    }
}

작업 3: 명명된 루프 만들기

다음은 "Practical Java Programming Problems for Spherical Cows" 시리즈의 또 다른 멤버입니다. 이것이 왜 필요한지 불분명하다는 의미에서: 루프에 이름이 지정되지 않았다는 사실로 인해 루프가 기분이 상할 가능성은 없습니다. 어쨌든 다른 이유로 중요합니다. 언어를 사용하면 루프의 이름을 지정할 수 있습니다.

해결책

참고: 이러한 "이름"은 일부 사람들에게 "레이블"로 알려져 있으며 실제로 사용하지 않는 것이 좋습니다. 명명된 루프를 보여주기 위한 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-elseforif-elseif-else

작업 4: 정수 배열에서 단일 중복 찾기

ArrayList1에서 100까지 모두 포함하는 정수 배열(또는 원하는 경우 ) 이 제공됩니다 Integer. 배열에는 하나의 중복 요소만 있습니다. 어떻게 찾습니까? Java 프로그래머가 이전 세 가지 작업보다 이러한 유형의 작업을 수행하는 것이 더 일반적입니다. 거의 사용되지 않는 언어의 미묘함에 대한 지식보다는 논리에 관한 것이기 때문입니다. 무자비한 힘을 사용하려는 첫 번째 억제되지 않은 충동은 두뇌가 작동하거나 "나는 프로그래머입니다. 나는 똑똑합니다." 유일한 문제는 인터뷰 중에 스트레스를 받으면 이런 일이 일어나지 않을 수 있다는 것입니다. 솔루션을 보기 전에 지금 생각해 보십시오!

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

1에서 100까지의 모든 숫자의 합을 계산합니다. 이 작업을 수행하는 방법을 알고 있다고 생각합니다(예: 가우스의 유명한 방법 사용). 이제 배열 또는 에 있는 요소의 합계를 계산합니다 ArrayList. 그리고... 두 번째 합계에서 첫 번째 합계를 뺍니다. 빙고! 결과 숫자는 중복 요소의 값입니다. . 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과 같은 것을 사용하는 것입니다. 자바에서 이 작업을 위한 코드:
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 작업이 있으며 면접관이 어떤 종류의 퍼즐을 풀도록 요청할지 알 수 없습니다. 그러나 분별 있는 고용주 라면 직장에서 접하게 될 것과 같은 실제적인 작업을 완료하는 능력이 트릭 질문을 해결하는 능력보다 훨씬 더 중요하다는 것을 이해합니다 . 따라서 가능한 한 많이 수행하십시오. 이것이 우리가 CodeGym을 만든 이유입니다. 이 기사를 작성하는 데 geeksforgeeks 의 자료가 사용되었습니다.
코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다