ここ2日間の日替わり問題はシーンシミュレーション問題ばかりだった気がします、まずはウォーミングアップから春の時期でしょうか^^
質問の説明
あなたはフォルダーのリストを持つシステム管理者であり、あなたのタスクはリスト内のすべてのサブフォルダーfolder
を削除し、残りのフォルダーを返すことです。任意顺序
フォルダーがfolder[i]
別のフォルダーの下にある場合folder[j]
、 はのサブフォルダーにfolder[i]
なります。folder[j]
フォルダーの「パス」は、次の形式で 1 つ以上の文字列を連結して形成された文字列です。'/'
その後に 1 つ以上の小文字の英字が続きます。
たとえば、"/leetcode"
と は"/leetcode/problems"
どちらも有効なパスですが、空の文字列 と は"/"
有効ではありません。
入力例: フォルダー = ["/a", "/a/b", "/c/d", "/c/d/e", "/c/f"] 出力: ["/a"
, " /c/d", "/c/f"]
入力: フォルダー = ["/a", "/a/b/c", "/a/b/d"]
出力: ["/a"]
アイデア
比較的簡単なシミュレーション問題。folder
最初に配列を並べ替えて、同じプレフィックスを持つファイル パスが一緒になるようにします。
次に、現在のフォルダーが結果セット内のフォルダーのサブフォルダーであるかどうかを確認します。サブフォルダーで
ある場合は、トラバースを続けます。
そうでない場合は、結果セットに追加します。
コード
class Solution {
public List<String> removeSubfolders(String[] folder) {
// 对数组进行排序
Arrays.sort(folder);
// 初始化结果集
List<String> result = new ArrayList<>();
for (String f : folder) {
// 当前文件夹不是结果集中文件夹的子文件夹
if (result.isEmpty() || !f.startsWith(result.get(result.size() - 1) + "/")) {
result.add(f);
}
}
return result;
}
}
注意すべき点:
!f.startsWith(result.get(result.size() - 1) + "/"
プレフィックスかどうかを判断するためにこのコードに追加されるのはなぜですか"/"
? "/"
これは、を付けないと の判定が で始まる文字列かどうかstartsWith
の判定になってしまうためで、省略すると のパスはのサブフォルダではなく のサブパスになってしまうからです。これは質問の要件と矛盾します。f
result.get(result.size() - 1)
"/"
f
result.get(result.size() - 1)
たとえば、result
パスが に保存されているとすると"/a/b/c"
、f
パスは になります"/a/b/ce"
。startsWith
追加されていない場合は"/"
、サブフォルダーであるf.startsWith(result.get(result.size() - 1))
と考えて true を返しますが、実際には同じレベルであるため、ロジックが期待どおりであることを確認するために追加する必要があります。"/a/b/ce"
"/a/b/c"
startsWith
"/"