C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++のファイルシステムからサブフォルダを削除する


フォルダのリストがあるとすると、それらのフォルダ内のすべてのサブフォルダを削除し、削除後に任意の順序でフォルダを返す必要があります。ここで、folder[i]が別のfolder[j]内にある場合、そのサブフォルダーとして示されます。パスはfolder1/subfolder2/…などのようになります。

入力が次のようであると仮定します

["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"], then the output will be:
["/myfolder","/another/final","/another/document"]

これを解決するには、次の手順に従います-

  • パスの長さに基づいてフォルダ配列を並べ替えます
  • 1つのマップmと、別の配列ansを作成します
  • 0からパス配列のサイズまでの範囲のiの場合– 1
    • s:=path_array [i]
    • temp:=空の文字列
    • フラグをtrueに設定
    • 範囲0からsのサイズのjの場合
      • temp:=temp + s [j]
      • jを1増やします
      • 一方、j <配列のサイズであり、s[j]は「/」ではありません
        • temp:=temp + s [j]、jを1増やします
      • m [temp]がfalseでない場合は、フラグ:=falseを設定し、中断します
  • フラグがtrueの場合、sをansに挿入し、m [s]:=trueを設定します
  • 回答を返す

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
   public:
   static bool cmp(string s,string x){
      return s.size()<x.size();
   }
   vector<string> removeSubfolders(vector<string>& f) {
      sort(f.begin(),f.end(),cmp);
      map <string,bool> m;
      vector <string> ans;
      for(int i =0;i<f.size();i++){
         string s= f[i];
         string temp="";
         bool flag = true;
         for(int j =0;j<s.size();){
            temp+=s[j];
            j++;
            while(j<s.size() && s[j]!='/'){
               temp+=s[j];
               j++;
            }
            if(m[temp]){
               flag = false;
               break;
            }
         }
         if(flag){
            ans.push_back(s);
            m[s]=true;
         }
      }
      return ans;
   }
};
main(){
   vector<string> v = {"/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"};
   Solution ob;
   print_vector(ob.removeSubfolders(v));
}

入力

["/myfolder","/myfolder/secondfolder","/another/document","/another/document/extrafolder","/another/final"]

出力

[/myfolder, /another/final, /another/document, ]

  1. C++の迷路

    空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。 ボールの位置、目的地、迷路を開始し、ボールが目的地に止まるかどうかを確認する必要があります。迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示します。迷路の境界はすべて壁です。開始座標と宛先座標は、行と列のインデックスで表されます。 したがって、入力が2D配列で表される迷路のようなものである場合 0 0 1 0 0

  2. C#のSortedSetからすべての要素を削除します

    SortedSetからすべての要素を削除するためのコードは、次のとおりです- 例 using System; using System.Collections.Generic; public class Demo {    public static void Main(){       SortedSet<string> set1 = new SortedSet<string>();       set1.Add("AB");