【九度】タイトル1090:パス印刷&【LeetCode】Simplify Path

5868 ワード

1、九度問題1090:パス印刷
時間制限:1秒メモリ制限:32メガ特殊判題:No提出:1319解決:230
タイトルの説明:
例えば、次のようなパスをあげます.
a\b\c
a\d\e
b\cst
d\
これらのパスに含まれるディレクトリ構造を描きます.サブディレクトリは親ディレクトリの下に直接表示され、親ディレクトリより右に1つ縮小されます.
a
  b
    c
  d  
    e
b
  cst
d
同じレベルのものはアルファベット順に並べなければならないので、乱れてはいけません.
入力:
各テストケースの第1の動作の正の整数n(n<=10)はnのパスを表し、nが0の場合、テストは終了し、次にnの行があり、各行に1つの文字列は50未満のパスを表す.
出力:
出力ディレクトリ構造は、各テストサンプルの出力が空の行に続いています.
サンプル入力:
4
a\b\c
a\d\e
b\cst
d\
0
サンプル出力:
a
  b
    c
  d
    e
b
  cst
d
ソース:
2005年上海交通大学コンピュータ研究生気試験の本題
質疑応答:
問題を解くのに問題がありますか.解題の心得を分かち合いますか?このトピックについては、次のトピックを参照してください.http://t.jobdu.com/thread-7813-1-1.html
【問題解きの考え方】
理論は木を建てて作ることができますが、少し複雑なようで、簡単で直接的なデータ構造が解決できます.
全体的な解決策は2つの部分に分けることができます.
1)、すべての経路を整理する.
2)、規則に従ってパスを印刷する.ここで、サブディレクトリのインデント長は、親ディレクトリ自体の長さ+親ディレクトリ個数+1であることに注意する
テスト例、印刷結果は次のとおりです.
4
a\ultra\c
a\d\e
b\wang\cst
d\cmd
a
  d
    e
  ultra
        c
b
  wang
       cst
d
  cmd
Java AC
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Pattern;
 
public class Main {
    /*
     * 1090
     */
    public static void main(String[] args) throws Exception {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            int n = scanner.nextInt();
            List<String> arrList = new ArrayList<String>();
            for (int i = 0; i < n; i++) {
                String tempStr = scanner.next();
                String tempArr[] = tempStr.split(Pattern.quote("\\"));
                String fir = tempArr[0];
                if (!arrList.contains(fir)) {
                    arrList.add(fir);
                }
                for (int j = 1; j < tempArr.length; j++) {
                    fir += "\\" + tempArr[j];
                    if (!arrList.contains(fir)) {
                        arrList.add(fir);
                    }
                }
            }
            Collections.sort(arrList);
            int size = arrList.size();
            StringBuffer sb = new StringBuffer();
            List<String> couList = new ArrayList<String>();
            for (int i = 0; i < size; i++) {
                String tempStr = arrList.get(i);
                String tempArr[] = tempStr.split(Pattern.quote("\\"));
                int count = 0;
                for (int j = 0; j < tempArr.length; j++) {
                    String str = "";
                    if (j != 0) {
                        count += tempArr[j-1].length();
                        count += 1;
                        int k = 0;
                        while (k < count) {
                            str += " ";
                            k++;
                        }
                    }
                    str += tempArr[j];
                    if (!couList.contains(str)) {
                        couList.add(str);
                        sb.append(str + "
"); } } } System.out.println(sb); } } } /************************************************************** Problem: 1090 User: wangzhenqing Language: Java Result: Accepted Time:100 ms Memory:15804 kb ****************************************************************/

2、LeetCode Simplify Path 
Total Accepted: 5778 Total Submissions: 29983 My Submissions
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
click to show corner cases.
Corner Cases:
Did you consider the case where path = "/../"?
In this case, you should return "/".
Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
In this case, you should ignore redundant slashes and return "/home/foo".
【問題解きの考え方】
1)、..を返します.何の意味もない.
2)、スタックで処理し、/と/の間の文字列を毎回取得する.処理しない、もし...スタックトップ要素がポップアップされ、親ディレクトリに戻ることを示します.他の文字列の場合は、ディレクトリであることを示し、スタックに入れます.
スタック要素が空の場合、ルートディレクトリで、直接出力/を説明します.そうしないと、ディレクトリが順次出力され、スタックの下部要素が第1レベルのディレクトリであることに注意します.
Java AC
public class Solution {
    public String simplifyPath(String path) {
        Stack<String> stack = new Stack<String>();
        int len = path.length();
        char array[] = path.toCharArray();
        for(int i = 0; i < len; i++){
            if(array[i] == '/'){
                StringBuilder sb = new StringBuilder();
                int j = i+1;
                while(j < len && array[j] != '/'){
                    sb.append(String.valueOf(array[j]));
                    j++;
                }
                i = j - 1;
                String tempStr = sb.toString();
                if(tempStr.length() == 0){
                    continue;
                }
                if(tempStr.equals("..")){
                    if(!stack.isEmpty()){
                        stack.pop();
                    }
                }else if(!tempStr.equals(".")){
                    stack.push(tempStr);
                }
            }
        }
        if(stack.isEmpty()){
            return "/";
        }
        String finalPath = "";
        while(!stack.isEmpty()){
        	finalPath = "/" + stack.peek() + finalPath;  
        	stack.pop();  
        }
        return finalPath;
    }
}