728. Self Dividing Numbers

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/self-dividing-numbers/

  • 整数の範囲が渡される
  • 範囲の中から、自身の桁ごとの数字で割り切れる値を抽出する
  • 0 を含む値は除外する

Solution

class Solution {
    public List<Integer> selfDividingNumbers(int left, int right) {
        return IntStream.range(left, right + 1)
                .mapToObj(DividingNumber::new)
                .filter(DividingNumber::isSelfDividingNumber)
                .map(DividingNumber::getValue)
                .collect(Collectors.toList());
    }
}

class DividingNumber {
    private int value;

    DividingNumber(int value) {
        this.value = value;
    }

    boolean isSelfDividingNumber() {
        return Arrays.stream(split(value)).allMatch(i -> i != 0 && this.value % i == 0);
    }

    int getValue() {
        return value;
    }

    private int[] split(int num) {
        String s = String.valueOf(num);
        int[] split = new int[s.length()];
        for (int i = 0; i < s.length(); i++) {
            split[i] = Character.getNumericValue(s.charAt(i));
        }
        return split;
    }

    @Override
    public String toString() {
        return "DividingNumber{" +
                "value=" + value +
                '}';
    }
}

Impressions

  • 元の値と桁ごとの値を同時に扱うようにしたので、箱としてクラスを作った
  • 範囲用に Stream#range がある
  • allMatch の存在を忘れて filter と count でどうにかしようとしちゃう

961. N-Repeated Element in Size 2N Array

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/n-repeated-element-in-size-2n-array/

  • 2N サイズの配列が与えられる
  • N+1 種類の整数が含まれている
  • 一つの要素が N 回繰り返されている
  • N 回繰り返されてる数を特定する

Solution

class Solution {
    public int repeatedNTimes(int[] A) {
        return Arrays.stream(A).boxed()
                .collect(Collectors.groupingBy(i -> i, Collectors.counting()))
                .entrySet().stream()
                .filter(it -> it.getValue() == A.length / 2)
                .map(Map.Entry::getKey)
                .findAny()
                .orElse(0);
    }
}

Impressions

  • Collectors.groupingByCollectors.counting() を組み合わせることで、Key ごとの数という Map が作れる
    • collect(Collectors.groupingBy(i -> i, Collectors.counting()))
  • 本当は groupingBy のところを自前で書くような問題なんだろう

References

JUnit5 を IntelliJ IDEA から実行できない #IntelliJIDEA

TL;DR

  • Maven のプロジェクトに JUnit5 の依存を追加した
  • コマンドラインからは通るが、 IntelliJ IDEA からの実行がエラーになる
  • junit-platform-launcher を依存に追加したら実行できるようになった

環境

詳細

公式の 4.2.2. Maven を見て依存を追加。

junit-jupiter-apijunit-jupiter-engine を追加。

これでコマンドラインから ./mvnw test でテストは実行できるようになった。

しかし IDEA から GUI でテスト実行しようとすると下記のようなエラーが出てしまう。

Error:java: エラー: リリース・バージョン5はサポートされていません

junit-platform-launcher を依存に追加すると解決した。

最終的な pom.xml には下記のような内容が記載してある。

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
        <plugin>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.22.2</version>
        </plugin>
    </plugins>
</build>

<dependencies>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>5.6.0</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>1.6.0</version>
        <scope>test</scope>
    </dependency>
</dependencies>

4.1.1. IntelliJ IDEA に古いバージョンは junit-platform-launcher , junit-jupiter-engine, and junit-vintage-engine を指定しろと記載しているものの、新しいバージョンではよしなにやってくれそうなことが書いてあるのでよく分からない。

参考

905. Sort Array By Parity

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/sort-array-by-parity/

  • 正の整数からなる配列を渡される
  • 偶数 -> 奇数の順にソートする
  • 偶数 -> 奇数であれば他の順序は問わない

Solution

class Solution {
    public int[] sortArrayByParity(int[] A) {
        return IntStream.concat(
                Arrays.stream(A).filter(i -> i % 2 == 0),
                Arrays.stream(A).filter(i -> i % 2 != 0)
        ).toArray();
    }
}

Impressions

  • Stream の結合には Stream#concat がある
    • 2つ以上なら Stream#of を使えばいい
    • 今回は int 配列なので IntStream

References

転職ドラフトに参加してみました

はじめに

こちらの記事は転職ドラフト体験談投稿キャンペーンに参加しています。

job-draft.jp

転職のあらましは別記事に書いてあるのですが、転職ドラフトにも参加してみたので、この記事を書いています。

su-kun1899.hatenablog.com

転職ドラフトに登録したきっかけ

もともとかなり前、それこそサービス開始したくらいの時に登録だけはしてあったんですが、レジュメ書くのがめんどくさくて放置していました笑

今回転職を考えたタイミングで

よさそうな会社ってどこがあるだろう?

転職ドラフトに参加してる企業から探してみるといいかも

どうせなら転職ドラフト参加してみるか

といった流れです。

レジュメ書くのは大変

レジュメは項目が多く、書くのはそれなりに大変で、さらに審査があります。

普通に書いてたら審査通るって人もいるんですが、僕は一度審査落ちました。

いわゆる職務経歴書のノリで書くよりは、プロジェクトベースで出来るだけ具体的に書くのがよさそうです。

  • 🙅 XXX の Web サービス開発していました!
  • 🙆 XXX に UnitTest と CI を導入しました!

大変ではあるんですが、キャリアシートの棚卸しって疎かになりがちなので、いいきっかけにもなりました。

転職ドラフトの指名状況

希望年収を書いてなかったのと、転職意欲が高いことを明示していたこともあるんでしょうが、10社以上から指名頂けました。

転職ドラフトのいいところ

事前に金額をはじめとした条件面の提示から始まるのは、効率的に転職活動できると思います。

提示年収に賞与は含めるか、裁量労働か、開発マシンは選べるかといったあたりまでかなり細かく明記されます。

お金を軸に転職する場合でなくても、下限(これくらいはもらえないと困る)は設定している人が多いのではないでしょうか。

提示額が少なかった場合でも、「興味はありますが、正直この待遇では厳しいです」というのを伝えてから会話することができます。

最終的なオファーと希望の乖離が大きいと、労力と時間とガッカリ感のコンボがすごいので(過去にそういう経験あります)

また、指名をくれた企業の殆どが、かなり丁寧に指名理由を書いてくれます。

レジュメやレジュメに記載したアウトプットをしっかり見た上で指名してもらえるのは納得感もあるし、うれしい気持ちになります。

転職ドラフトの選考

実際に足を運んだ後は、普通の転職活動と基本的に変わらないと思います。

スケジュール調整やメッセージのやりとりが転職ドラフト上で行われることくらいでしょうか。

採用保証ではないので、普通に選考で落ちたりもします。

転職ドラフトを使ったことがない方へのメッセージ

レジュメを書いたりするのはそれなりに大変ですが、転職を少しでも考え始めた人は試しに参加してみてもよさそうです。

キャリアの棚卸しのきっかけにもなりますし。

逆に転職をまったく考えてない場合だと、面倒くささのほうが勝ってしまうかも知れません笑

この記事を見て参加してみようと思った人は是非僕の招待コード【 GTXI 】を使ってみてください。

オライリー本とかがプレゼントでもらえるみたいです。

832. Flipping an Image

LeetCode の挑戦ログ

Problem

https://leetcode.com/problems/flipping-an-image/

  • バイナリマトリックス(二次元配列)が渡される
  • 各行をひっくり返した後、反転させる

Solution

class Solution {
    public int[][] flipAndInvertImage(int[][] A) {
        return Arrays.stream(A)
                .map(this::flip)
                .map(this::invert)
                .collect(Collectors.toList())
                .toArray(new int[][]{});
    }

    private int[] flip(int[] array) {
        int[] flipped = new int[array.length];
        int count = 0;
        for (int i = array.length; i > 0; i--) {
            flipped[count] = array[i - 1];
            count++;
        }
        return flipped;
    }

    private int[] invert(int[] array) {
        return Arrays.stream(array).map(i -> i == 0 ? 1 : 0).toArray();
    }
}

Impressions

  • flip は Collection にするより配列のままの方がやりやすそうだったのでそうした
  • 問題とは関係ないが、多次元配列を文字列にするのに Arrays#deepToString があるのを知った