JavaRush /Java Blog /Random-JA /トリックを使用した Java の問題: こんにちは、インタビューです!

トリックを使用した Java の問題: こんにちは、インタビューです!

Random-JA グループに公開済み
JavaRush の 学生にとって、プログラミングの課題、Java、およびバリデータは親友です。ただし、すべての開発者パダワンには、時には常軌を逸した道を歩み始めたり、自分用のミニプロジェクトを考え出したり、面接の準備をしたりする必要がある時期が来ます。面接では、コースとまったく同じ実践的な Java の問題に遭遇することになるようです。ほとんどの場合これは当てはまりますが、ひっかけ質問や珍しい質問をしたがる企業もあります。ストレスの多い面接中に混乱しないようにするには、このような Java の問題を自宅で自分で解決してみると効果的です。
トリックを使用した Java の問題: こんにちは、インタビューです!  - 1
この記事では、これらの難しいタスクの 6 つを見ていきます。まずは条件を読んで、自分で解決してみることをお勧めします。そしてもう 1 つ、コースにある Java の問題を毎日解くことを忘れないでください。

Java の問題 - 1: 無限ループを最初から作成する

コードのブロックが与えられます。ループが無限になるように完了します。
class ToInfinity {
    public static void main(String[] args) {

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

        for (int i = start; i <= start + 1; i++) {
             /* тут должен быть бесконечный цикл, менять ничего нельзя*/
        }
    }
}
「何も複雑なことはありません」とあなたは言います。おそらく、Java の問題を解決しているときに、無限ループが作成され、それを取り除く方法を考えたことがあるでしょう。それはその逆です。重要なのは、サイクル自体とその終了条件は変更できないことです。反復は 2 回だけです。ただし、無限ループを作成するには十分な数があります。2 回の反復でのみ機能するように見えますが、オーバーフローを使用すると無限にすることができます。方法はもうわかりましたか?

解決

オーバーフローのため。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 タスク-2. 実行されるコメントを作成する

さて、ここに来ました!コメントは実行されないということは最初の講義から聞いていました。だからこそコメントなのです。この問題の解決策は、Java プログラマにとって、たとえ経験豊富なプログラマにとっても必ずしも明らかではないと考えられます。ただし、Java マシンにコメントの実行を「合法的に」強制する、注意が必要な方法が 1 つあります。風がどこから吹いているか感じますか?推測してみてください!

解決

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」。なぜこれが必要なのかが明確ではないという意味では、このサイクルが非人間的であるという事実を不快に感じる可能性は低いです。さて、もう 1 つ重要なことがあります。言語ではサイクルに名前を付けることができます。

解決

注: このような「名前」は「タグ」として知られている人もいますが、実際に使用することはお勧めできません。 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(またはcontinue)を使用して、 を使用して複数のループを分割できます。これにより、多数のフラグを設定したり、内側のループを続行するか終了するかを決定するためにフラグをテストしたりすることを回避できます。 if-elseforif-elseif-else

Java の問題 - 4. 整数の配列内の唯一の重複について

1 から 100 までの要素を含む整数の配列 (またはArrayList、好みに応じて )を指定しますInteger。この配列には重複した要素が 1 つだけあります。どうやって見つけますか? このようなタスクは、Java プログラマにとって、前の 3 つのタスクよりも馴染み深いものです。それは、ほとんど使われることのない言語の機微を知ることではなく、論理について知ることだからです。力ずくで解決したいという最初の抑えられない衝動は、頭が回転するか、「私はプログラマーであり、賢いのだ」という態度が生まれると、すぐに消えます。唯一残念なのは、面接中にストレスがかかると、このようなことが起こらない可能性があることです。解決策を検討する前に、今考えてください。

解決アルゴリズムは次のとおりです。

1 から 100 までのすべての数値の合計を計算します。これを行う方法 (たとえば、有名なガウス法を使用する) はご存知だと思います。次に、配列 または の要素の合計を計算しますArrayList’а。そして...最初の金額を 2 番目の金額から引きます。ビンゴ!結果として得られる数値は、重複した要素の値です。 の 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