CodeGym /Java Blog /ランダム /ひねりを加えた Java タスク: こんにちは、インタビューです!
John Squirrels
レベル 41
San Francisco

ひねりを加えた Java タスク: こんにちは、インタビューです!

ランダム グループに公開済み
CodeGym の学生の親友は、プログラミング タスク、Java、およびタスク バリデータです。それでも、すべてのパダワン開発者が人里離れた道を歩み始め、独自のミニプロジェクトを考案し、面接の準備をしなければならない時期が来ます。面接では、このコースで行われるのとまったく同じ実践的な Java タスクが行われると思われるかもしれません。ほとんどの場合はそうなのですが、ひっかけ質問や馴染みのない質問をしたがる企業もあります。ストレスの多い面接中に混乱しないようにするには、自宅で同様の Java タスクを自分で解決してみると効果的です。
ひねりを加えた Java タスク: こんにちは、インタビューです!  - 1
この記事では、そのような難しい 5 つのタスクについて説明します。まずは条件を読んで、自分で解決してみることをお勧めします。そしてもう 1 つ、このコースの 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 タスクを完了するときに無限ループが作成され、それを取り除く方法を考えなければならなかったという、このシナリオに何度も遭遇したことがあるでしょう。まあ、これは逆です。ここが難しい部分です。ループ自体やその終了条件を変更することはできません。反復は 2 回だけです。ただし、無限ループを作成するには十分です。2 回の反復のみ実行する必要があるように見えますが、オーバーフローを使用して無限にすることができます。方法はもうわかりましたか?

解決

オーバーフローのため、がJava に格納できるInteger.MAX_VALUE最大値です。intこの値に達して増加すると、 、つまり可能な限り最も低い値Integer.MAX_VALUEにロールバックします。したがって、この Java タスクを完了するには、最大値より 1 小さい値を変数に代入するだけで済みます。このタスクの Java コード: Integer.MIN_VALUEIntegerintstart

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 にコメントを実行させるための、注意が必要な (ただし「合法的な」) 方法が 1 つあります。私たちがどこに向かっているのか感じられますか?推測してみてください!

解決

このタスクの 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 コンパイラーが Unicode 文字を\u000d新しい行として解釈し、次のようにコードを読み取るためです。コンパイラーによって解釈される、このタスクの Java コード:

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

タスク 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 を使用して、名前付きループの先頭に戻ることもできます。また、必要に応じて、ネストされたループ内でbreak(またはcontinue)if-elseを使用してfor、 を使用して複数のループを分割することができますif-else。これにより、多数のフラグを作成し、それらをステートメント内でチェックしてif-else内部ループを続行するか終了するかを決定することを回避できます。

タスク 4: 整数の配列内で単一の重複を見つける

ArrayList1 から 100 までのすべてを含む整数配列 (または、必要に応じて )が与えられます。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();
// 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 のようなものを使用することです。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 の実践的なタスクにはさまざまな種類があり、面接官がどのような種類のパズルを解くように求められるかわかりません。しかし、賢明な雇用主であれば、仕事中に遭遇するような実際の実践的なタスクを完了する能力の方が、ひっかけ問題を解く能力よりもはるかに重要であることを理解しています。したがって、これらをできるだけ実行してください。それが私たちが CodeGym を作成した理由です。この記事の作成には geeksforgeeksの資料が使用されました。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION