JavaRush /Java Blog /Random-TW /Java問題一招:您好,面試!

Java問題一招:您好,面試!

在 Random-TW 群組發布
對於JavaRush 學生來說,程式設計挑戰、Java 和驗證器是最好的朋友。然而,對於每個開發新手來說,有時他需要走出人跡罕至的地方,為自己想出一些小項目,並為面試做準備。在面試中,你似乎應該遇到與課程中完全相同的 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並增加該值,則會向下捲動到Integer.MIN_VALUE,即滾動到最小值Integer。因此,要解決這個 Java 問題,我們只需start為變數分配一個比資料類型的最大值小 1 的值intJava中的任務程式碼:
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 鍵入此任務的程式碼,我們將得到以下結果:
выполняемый комментарий
原因是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」。從某種意義上說,尚不清楚為什麼這是必要的,循環不太可能因為它是非個人化的事實而感到冒犯。好吧,還有一點很重要:語言允許你為循環命名。

解決方案

注意:對於某些人來說,這樣的“名稱”被稱為“標籤”,不建議在實踐中使用。 用 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 到命名循環的開頭。如果需要,您可以在嵌套的with循環中使用break(或)來使用 分解多個循環。這將有助於避免設置大量標誌並測試它們以確定是繼續還是退出內循環。 continueif-elseforif-elseif-else

Java 問題 - 4. 關於整數陣列中的唯一重複項

ArrayList給定一個包含從 1 到 100的元素的整數數組(或,根據您的喜好) Integer。該數組有且僅有一個重複元素。如何找到它?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 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