Summary Ranges - LeetCode

 

다음 숫자와 차이가 1보다 크면 같은 범위에 속한 숫자가 아니게 된다.

포인터를 두고 확장해 나가며 범위를 구해 정답에 추가하자.

class Solution {
    public List<String> summaryRanges(int[] nums) {
        if (nums.length == 0) {
            return List.of();
        }
        List<String> result = new ArrayList<>();
        int s = 0;
        int prev = nums[s];
        int e;
        for (e = 0; e < nums.length; e++) {
            if (Math.abs(nums[e] - prev) > 1) {
                // 범위를 벗어난 상태 s부터 e-1까지 유효 범위
                if (s != e - 1) {
                    result.add(nums[s] + "->" + nums[e - 1]);
                } else {
                    result.add(String.valueOf(nums[s]));
                }
                s = e;
            }
            prev = nums[e];
        }

        if (s == e - 1) {
            result.add(String.valueOf(nums[s]));
        } else {
            result.add(nums[s] + "->" + nums[e - 1]);
        }

        return result;
    }
}

여기서 주의해야 할 점은 크기 비교 부분이다.

nums[e] - prev > 1 이렇게 판정을 할 시 배열의 값이 int 범위이므로 오버플로우가 발생할 수 있다.

예를 들어 2147483647와 -2147483647를 보면 알 수 있다.

2147483647 - (-2147483647)를 하면 오버플로우로 순환이 발생해 -2가 반환값으로 나오게 된다.

이를 해결하기 위해 거리개념을 도입하기 위해 Math.abs를 사용했다. 아니면 오버플로우를 방지하기 위해 long으로 변환해 계산해도 된다.

+ Recent posts