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 でどうにかしようとしちゃう