Crawler Log Folder ကို Leetcode ဖြေရှင်းချက်


ခက်ခဲအဆင့် လွယ်ကူသော
မကြာခဏမေးတယ် မာကာရီ
စုပုံထား

ပြProbleနာဖော်ပြချက်

ဤပြproblemနာတွင်ဖိုင်တွဲစနစ်တွင်ကျွန်ုပ်တို့၏ရပ်တည်ချက်ကိုခြေရာခံသည်။ ကျွန်ုပ်တို့သည်အစပိုင်းတွင် root ဖိုဒါသို့မဟုတ်ဤစနစ်၏အဓိကဖိုင်တွဲတွင်ရှိသည်။
ဒီမှာအခြေခံအားဖြင့် ၃ မျိုးရှိတယ်။ command များသည် string ပုံစံဖြစ်သည်။ string တစ်ခုချင်းစီသည် command ကိုဆိုလိုသည်။

  •  “ ../” ဆိုသည်မှာလက်ရှိဖိုင်တွဲ၏ပင်မဖိုလ်ဒါသို့သွားသည် (ဆိုလိုသည်မှာ root ဖိုင်တွဲတွင်ရှိနှင့်လျှင်မည်သည့်နေရာမှမသွားပါ) ။
  •  “ ./” လက်ရှိဖိုင်တွဲတွင်နေပါ။
  •  “ x /” အမည်မှာရှိသောလက်ရှိဖိုင်တွဲ၏ကလေးဖိုလ်ဒါသို့သွားပါ။

အထက်ပါ command သုံးခုပေါင်းစပ်ထားသော command များကိုကျွန်ုပ်တို့အားပေးသည်။ ပေးထားသော command များကို preform လုပ်ပြီးသောအခါ root folder ထဲသို့ပြန်သွားရန်အနည်းဆုံးလုပ်ဆောင်ချက်အနည်းဆုံးကိုကျွန်ုပ်တို့ရှာဖွေရမည်။
ဥပမာ
logs = [“ d1 /”,” d2 / кг,кг../”,” d21 / кг, ။. ””

Crawler Log Folder ကို Leetcode ဖြေရှင်းချက်
ကျနော်တို့ root folder ထဲကနေအတိမ်အနက်ကို 2 မှာရှိပါတယ်။ ထို့ကြောင့်ကျွန်ုပ်တို့၏အဖြေမှာ ၂ ဖြစ်သည်။

နမူနာ

logs = ["d1/","d2/","../","d21/","./"]
2

ရှင်းလင်းချက်:

ဤပြောင်းလဲမှုဖိုင်တွဲကို .. ../ ကို ၂ ကြိမ်သုံးပြီးပင်မဖိုင်တွဲသို့ပြန်သွားပါ။

logs = ["d1/","d2/","./","d3/","../","d31/"]
3

ချဉ်းကပ်နည်း ၁ (ပုံကို သုံး၍)

ကျနော်တို့ဖိုင်အမည်များ stack ကိုသုံးနိုင်သည်။ အစပိုင်း၌ကျွန်ုပ်တို့၏ stack ဗလာ။ ကျွန်ုပ်တို့ subfolder သို့ပြောင်းရန်လိုအပ်သည့်အခါ subfolder ၏အမည်ကို stack ထဲသို့တွန်းပေးသည်။ ထို့ကြောင့်ကျွန်ုပ်တို့လက်ရှိရှိနေသော folder သည် stack ၏ထိပ်တွင်အမြဲရှိနေလိမ့်မည်။
ထို့ကြောင့်“ ../” ကိုတွေ့သည့်အခါကျွန်ုပ်တို့သည်လက်ရှိဖိုလ်ဒါ (ဥပမာ - မိဘဖိုလ်ဒါသို့ရွှေ့ခြင်း) မှထွက်ရန်လိုအပ်သည်ဆိုလျှင်လက်ရှိဖိုလ်ဒါသည် root လားဟုတ်မဟုတ်စစ်ဆေးလိမ့်မည်။ မရှိပါက stack မှထိပ် element ကိုပေါ်လာလိမ့်မည်။
ထို့အပြင်ကျွန်ုပ်တို့သည်“ ./” နှင့်တွေ့သောအခါကျွန်ုပ်တို့သည်ဘာမျှမလုပ်ရပါ။
ဤလှောင်ပြောင်မှုသုံးခုကိုလှေကားတစ်ချောင်းလျှင်အသုံးပြုသည်။

ဤနေရာတွင်ကျွန်ုပ်တို့သိသင့်သည်မှာတစ်ခုမှာ stack ထဲတွင်ရှိသော element အရေအတွက်သည်ကျွန်ုပ်တို့လက်ရှိ root folder မှမည်မျှနက်ရှိုင်းသည်ဟုဆိုခြင်းဖြစ်သည်။
ထို့ကြောင့်အဆုံး၌ stack အရွယ်အစားကိုဆိုလိုသည်။

Crawler Log Folder ကို Leetcode Solution အတွက်အကောင်အထည်ဖော်ခြင်း

C ++ အစီအစဉ်

#include <iostream>
#include <stack>
#include <vector>
using namespace std;
int minOperations(vector<string>& logs) {
        stack<string>stack;
        for(string log:logs){
            if(log=="../"){
                if(stack.size()>0)stack.pop();
            }
            else if(log=="./");
            else{
                stack.push(log);
            }
        }
        return stack.size();
    }
int main()
{
    vector<string>logs{"d1/","d2/","../","d21/","./"};
    cout<<minOperations(logs);
}
2

Java အစီအစဉ်

import java.util.*;
import java.lang.*;

class Solution
{  
    public static int minOperations(String[] logs) {
        Stack<String>stack=new Stack<String>();
        for(String log:logs){
            if(log.equals("../")){
                if(stack.size()>0)stack.pop();
            }
            else if(log.equals("./"));
            else{
                stack.push(log);
            }
        }
        return stack.size();
    }
    
    public static void main(String args[])
    {
        String[]logs={"d1/","d2/","../","d21/","./"};
        
        System.out.println(minOperations(logs));
    }
}
2

Crawler မှတ်တမ်း Folder ကို Leetcode ဖြေရှင်းချက်များအတွက်ရှုပ်ထွေးခွဲခြမ်းစိတ်ဖြာခြင်း

အချိန်ရှုပ်ထွေး

အို ()) ပေးထားသော strings များကို lineari ဖြတ်၍ O (1) time တစ်ခုစီတွင် stack operation လုပ်နေသည်။ ထို့ကြောင့်အချိန်ရှုပ်ထွေးမှုသည်အို (n) ဖြစ်ပြီး n သည် input ခင်း၏အရှည်ဖြစ်သည်။

အာကာသရှုပ်ထွေးမှု 

အို ()) ကျနော်တို့အရွယ်အစားပေးထားသော input ကိုခင်းကျင်းအရှည်ညီမျှနိုင်ပါတယ်တဲ့ stack ကိုအသုံးပြုခဲ့သည်။ ထို့ကြောင့်အဆိုးဆုံးအာကာသရှုပ်ထွေးမှုသည်အို (n) ဖြစ်သည်။

ချဉ်းကပ်နည်း 2 (နက်ရှိုင်းသော variable ကိုအသုံးပြုခြင်း)

အခြေခံအားဖြင့်ကျွန်ုပ်တို့သည် root folder မှမည်သည့်အတိမ်အနက်ကိုပြနေကြောင်းကိုပြသည့်နက်ရှိုင်းသောပြောင်းလဲမှုကိုခြေရာခံရုံဖြင့်အလွယ်တကူဖြေရှင်းနိုင်သည်။
ကလေးသူငယ်ဖိုလ်ဒါတစ်ခုသို့သွားသောအခါအမြစ်ဖိုင်တွဲမှအကွာအဝေး ၁ အထိကျွန်ုပ်တို့ဝေးသွားသည် (ဆိုလိုသည်မှာ depth ++)
ကျွန်ုပ်တို့သည်မိဘဖိုင်တွဲတစ်ခုသို့သွားတိုင်းအကွာအဝေး ၁ အားဖြင့် root folder သို့နီးကပ်လာခြင်းကိုလျှော့ချနေသည် (ဆိုလိုသည်မှာအတိမ်အနက် -) ။
သတိပြုရမည်မှာကျွန်ုပ်တို့သည် root ဖိုလ်ဒါတွင်မရှိလျှင် parent folder သို့သာရွှေ့နိုင်သည်။
ဒါကြောင့်ဘယ်ဘက်ကနေညာဘက်ကို for အတွက်စတင်လုပ်ဆောင်ပါလိမ့်မယ် ကွင်းဆက် .

  • “ ../” နှင့်ကျွန်ုပ်တို့တွေ့ပါကကျွန်ုပ်တို့သည် root folder ရှိ၊ မရှိကိုစစ်ဆေးပါမည်။ အဘယ်သူမျှမလျှင်, ငါတို့သည် 1 အားဖြင့်အတိမ်အနက်ကိုလျော့ချလိမ့်မယ်။
  • အကယ်၍“ ./” နှင့်တွေ့ပါကကျွန်ုပ်တို့သည်လက်ရှိဖိုလ်ဒါတွင်နေရမည်။
  • ကျန်တဲ့ငါတို့ကလေးတွေဖိုင်တွဲထဲကိုပြောင်းရမယ်။ ထို့ကြောင့်ကျွန်ုပ်တို့သည်ကျွန်ုပ်တို့၏အတိမ်အနက်ကို 1 ဖြင့်တိုးပွားစေလိမ့်မည်။

Command တွေအကုန်လုံးပြီးသွားပြီဆိုရင်ကျွန်တော်တို့ရဲ့ variable က root folder နဲ့အကွာအဝေးကိုသိုလှောင်ထားတယ်။ ကျနော်တို့က output အဖြစ်ပြန်လာပါလိမ့်မယ်။

Crawler Log Folder ကို Leetcode Solution အတွက်အကောင်အထည်ဖော်ခြင်း

C ++ အစီအစဉ်

#include <iostream>
#include <vector>
using namespace std;

int minOperations(vector<string>& logs)
{
    int depth=0;
    for(string log:logs)
    {
        if(log=="../")
        {
            if(depth>0)depth--;//moving to parent folder only if depth>0 i.e. current folder is    
                                 other than main folder 
        }
        else if(log=="./");    //staying to current folder
        else depth++;          //moving to child folder
    }
    return depth;
}
int main()
{
    vector<string>logs{"d1/","d2/","../","d21/","./"};
    cout<<minOperations(logs);
}
2

Crawler Log Folder ကို Leetcode Solution အတွက် Java Program

import java.util.*;
import java.lang.*;

class Solution
{  
    public static int minOperations(String[] logs)
    {
        int depth=0;
        for(String log:logs)
        {
            if(log.equals("../"))
            {
                if(depth>0)depth--;//moving to parent folder only if depth>0 i.e. current folder is other than main folder 
            }
            else if(log.equals("./"));  //staying to current folder
            else depth++;               //moving to child folder
        }
        return depth;
    }
    
    public static void main(String args[])
    {
        String[]logs={"d1/","d2/","../","d21/","./"};
        
        System.out.println(minOperations(logs));
    }
}
2

Crawler မှတ်တမ်း Folder ကို Leetcode ဖြေရှင်းချက်များအတွက်ရှုပ်ထွေးခွဲခြမ်းစိတ်ဖြာခြင်း

အချိန်ရှုပ်ထွေး

အို ()) Command တွေအားလုံးကိုတစ်ပြိုင်တည်းလုပ်ဆောင်နေပါတယ်။ ထို့ကြောင့်အချိန်ရှုပ်ထွေးအို ()) ဖြစ်ပါတယ်။

အာကာသရှုပ်ထွေးမှု 

အို (၁) ကျနော်တို့နက်ရှိုင်းတဲ့ variable ကိုအသုံးပြုခဲ့ကြသည်။ ထို့ကြောင့်အာကာသရှုပ်ထွေးအို (1) ဖြစ်ပါတယ်။