[LeetCode] 228. Summary Ranges


228. Summary Ranges


質問リンク:https://leetcode.com/problems/summary-ranges/

ソートされた配列numsが受信され、問題は、配列内のすべての数値を上書きする最小ソート範囲のリストを返すことである.
つまり、連続した数字は最初の数字と最後の数字を→のrangeに接続し、そうでなければリストに直接置くことができます.
まず、1番目の数字startと終了数字endとを→に接続し、range stringに戻るgetRange()の方法が形成される.
public String getRange(int start, int end) {
        StringBuilder sb = new StringBuilder();
        sb.append(start);
        if(start != end) sb.append("->").append(end);
        return sb.toString();
    }
Stringを追加するためにStringBuilderを使用しました.

StringBuilder


Stringは可変であるため、Stringオブジェクトを作成すると、割り当てられたメモリ領域は変更されません.
「+」演算子またはconcatメソッドを使用して、既存のStringクラスオブジェクト文字列に新しい文字列を貼り付けるのではなく、既存の文字列に新しい文字列を貼り付けて、新しいStringオブジェクトを作成した後に、新しいStringオブジェクトに関連付けられた文字列を保存し、そのオブジェクトを参照します.(つまり、Stringクラスオブジェクトはheapメモリ領域(ゴミ収集のアクティブ領域)に作成され、作成したオブジェクトの内部内容は一度に変更できません.)
これらのため、Stringオブジェクトは文字列演算が多すぎるとパフォーマンスが低下します.
これに対して、StringBuilderはStringのように新しいオブジェクトを作成する必要がなく文字列を修正することができるので、可変であり、単一スレッドでの性能はStringBufferより優れている.
したがって、range Stringの作成にはStringBuilderが使用される.
このとき、1番目の数字startと最後の数字endが同じ場合、rangeに1つの数字を加算する.
次に、input配列の要素を1つずつループし、連続する2つの要素を比較し、2つの数字が連続していない場合はsubrangeを中断し、getRange()でrange stringを作成し、戻るリストに挿入します.不連続な2番目の数字をstart変数に入れ、次のsubRangeを開始します.
このように問題を解くと,配列の最後の要素がlistに残る.end変数に直接入れてgetRange()関数を呼び出すと、配列の最後の要素が最初のsubRangeに追加され、そうでなければ個別のsubRangeに割り当てられます.

Solution

class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> summaryOfTheRange = new ArrayList<String>();
        if(nums.length == 0) return summaryOfTheRange;
        
        String subRange="";
        int start=nums[0];
        for(int i=1;i<nums.length;i++) {
            if(nums[i-1]+1 != nums[i]) { 
                subRange = getRange(start, nums[i-1]);
                summaryOfTheRange.add(subRange);
                start = nums[i];
            }
        }
        subRange = getRange(start, nums[nums.length-1]);
        summaryOfTheRange.add(subRange);
        return summaryOfTheRange;
    }
    
    public String getRange(int start, int end) {
        StringBuilder sb = new StringBuilder();
        sb.append(start);
        if(start != end) sb.append("->").append(end);
        return sb.toString();
    }
}