2017年9月30日土曜日

TapeEquilibrium(Lesson3)

問題

コード1

public int solution(int A[]) {

    int diff = Integer.MAX_VALUE;
    int N = A.length;

    int left = 0;
    for (int i = 0; i < N - 1; i++) {
        left += A[i];

        int right = 0;
        for (int j = N - 1; j > i; j--) {
            right += A[j];
        }

        diff = Math.min(diff, Math.abs(left - right));
    }
    return diff;
}

コード2

  • コード1ではパフォーマンスが悪くTest scoreが100にならないので、以下で実施
public int solution(int A[]) {

    int diff = Integer.MAX_VALUE;
    int N = A.length;

    // 合計値
    int sum = 0;
    for (int i = 0; i < N; i++) {
        sum += A[i];
    }

    int left = 0;
    int right = sum;
    for (int i = 0; i < N - 1; i++) {
        left += A[i];
        right -= A[i];

        diff = Math.min(diff, Math.abs(left - right));

    }
    return diff;
}

2017年9月8日金曜日

CyclicRotation(Lesson2)

問題

コード1

public int[] solution(int[] A, int K) {

    int[] B = new int[A.length];

    for (int i = 0; i < A.length; i++) {
        B[(i + K) % A.length] = A[i];
    }

    return B;
}

2017年9月6日水曜日

OddOccurrencesInArray(Lesson2)

問題

コード1

  • 奇数なので足して偶数、偶数でないものが返却すべき値
public int solution(int A[]) {

    for (int i = 0; i < A.length; i++) {
        int count = 0;
        for (int j = 0; j < A.length; j++) {
            if (A[i] == A[j]) {
                count++;
            }
        }
        if (count % 2 != 0) {
            return A[i];
        }
    }
    return A[0];
}

コード2

  • コード1ではパフォーマンスが悪くTest scoreが100にならないので、以下で実施

    1. 配列をソート
    2. 奇数 番目と偶数番目が同じ値でない場合、返却するべき値
public int solution(int A[]) {

    Arrays.sort(A);
    for (int i = 0; i < A.length - 1; i++){
        if(A[i] != A[i + 1]){
            return A[i];
        }
        i = i + 1;
    }
    return A[A.length-1];
}

FrogJmp(Lesson3)

問題

コード1

public int solution(int X, int Y, int D) {

    return (int) Math.ceil((double) (Y - X) / D);

}

BinaryGap(Lesson1)

問題

コード1

  1. 2進数に変換(Integer#toBinaryString)
  2. 文字列を char型の配列に変換( String#toCharArray)
public int solution(int N) {

    char[] chars = Integer.toBinaryString(N).toCharArray();

    int gap = 0;
    int count = 0;
    for (char num : chars) {
        if (num == '0') {
            count++;
        } else {
            if (count > gap) {
                gap = count;
            }
            count = 0;
        }
    }
    return gap;
}

コード2

  • コード1ではchar型の配列でループしていたが「1」で文字列を分割する

    1. 文字列の最後、全て「0」を削除( String#replaceAll)
    2. 「1」で文字列を分割する( String#split)
public int solution(int N) {

    String[] strings = Integer.toBinaryString(N)
            .replaceAll("0+$", "")
            .split("1");

    int gap = 0;
    for (String str : strings) {
        int count = str.length();
        if (count > gap) {
            gap = count;
        }
    }
    return gap;
}

コード3

  • コード2をjava8に変換
public int solution(int N) {

    return Stream.of(Integer.toBinaryString(N)
            .replaceAll("0+$", "")
            .split("1"))
            .max((e1, e2) -> Integer.compare(e1.length(), e2.length()))
            .map(e -> e.length())
            .orElse(0);
}

PermMissingElem(Lesson3)

問題

コード1

public int solution(int A[]) {

    Arrays.sort(A);

    int count = 1;
    for (int i : A) {
        if (i != count) {
            return count;
        }
        count++;
    }
    return count++;
}