[LeetCode] 228. Summary Ranges
10301 ワード
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();
}
}
Reference
この問題について([LeetCode] 228. Summary Ranges), 我々は、より多くの情報をここで見つけました
https://velog.io/@lychee/LeetCode-228.-Summary-Ranges
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
public String getRange(int start, int end) {
StringBuilder sb = new StringBuilder();
sb.append(start);
if(start != end) sb.append("->").append(end);
return sb.toString();
}
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();
}
}
Reference
この問題について([LeetCode] 228. Summary Ranges), 我々は、より多くの情報をここで見つけました https://velog.io/@lychee/LeetCode-228.-Summary-Rangesテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol