71 LeetCode質問:簡易パス(平均)
- タイトル:Unixのスタイルは絶対ファイルパスを与えるために、あなたはそれを単純化する必要があります。換言すれば、パス指定に変換します。Unix形式のファイルシステムでは、ドットは、カレントディレクトリ自体を表す(。);また、2つのドット(...)(親ディレクトリ)にディレクトリを示し、比較的複雑な経路で構成されてもよいどちらもセクション。詳細については、以下を参照してください。LINUX / UNIX VS絶対パスが相対パスです。仕様は、/常に先頭に/スラッシュでパスに戻らなければならない、と2つのスラッシュの間だけ1つのディレクトリ名を持たなければならないことに注意してください。(があれば)最後に、ディレクトリ名は/で終わるわけで。また、仕様は、絶対パス文字列でなければならない最短経路を表します。
- 思想:方法の質問は、私は道に状態のセットを選んだことを練習問題へ順に、第65回のタイトルの問題の重要な数字と考えています。私はこの点を残すことができたときに長い時間のために研究しているしていないとき、ディレクトリの名前さえも、(黒疑問符面???)のポイントを含めることができると思います。。。。最後に、私はほとんど前に消耗していたとき。。。。
class Solution {
public int make(char c){
switch(c){
case '.' :return 0;
case '/' :return 1;
default:
return 2;
}
}
public String simplifyPath(String path) {
String res = "";
char[] ans = new char[path.length()];
ans[0]='/';
int state = 0;
int j = 1;
int[][] transfer = new int[][]{{ 1, 0, 2},
{ 3, 0, 2},
{ 1, 0, 2},
{ 2, 0, 2}};
char[] ss = path.toCharArray();
for(int i=1;i<ss.length;i++){
int id = make(ss[i]);
int stateNew=transfer[state][id];
if(state==0){
if(id==0){
ans[j++]='.';
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==1){
if(id==0){
ans[j++]='.';
}else if(id==1){
if(ans[j-2]=='/'){
j=j-1;
}else if(i!=ss.length-1){
ans[j++]='/';
}
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==2){
if(id==0){
ans[j++]='.';
}else if(id==1 && i!=ss.length-1){
ans[j++]='/';
}else if(id==2){
ans[j++]=ss[i];
}
}else if(state==3){
if(id==0){
ans[j++]='.';
}else if(id==1){
if(j>4){
j=j-4;
while(j>0 && ans[j] != '/'){
j--;
}
j++;
}else{
j=1;
}
}else if(id==2){
ans[j++]=ss[i];
}
}
state=stateNew;
}
if(state==3){
if(j>4){
j=j-4;
while(j>1 && ans[j] != '/'){
j--;
}
}else{
j=1;
}
}else if(state==1){
j=j-1;
}
if(j>1 && ans[j-1]=='/') j--;
for(int k=0;k<j;k++){
res+=ans[k];
}
return res;
}
}
- 2考える:メソッドがされているにスタック、および犠牲者に問題の解決策は、私はしません。次回は、私は、スタック方式再びそれに類似した問題が発生しました。。。。
public String simplifyPath(String path) {
String[] s = path.split("/");
Stack<String> stack = new Stack<>();
for (int i = 0; i < s.length; i++) {
if (!stack.isEmpty() && s[i].equals(".."))
stack.pop();
else if (!s[i].equals("") && !s[i].equals(".") && !s[i].equals(".."))
stack.push(s[i]);
}
if (stack.isEmpty())
return "/";
StringBuffer res = new StringBuffer();
for (int i = 0; i < stack.size(); i++) {
res.append("/" + stack.get(i));
}
return res.toString();
}
作者:StackOverflow-
链接:https://leetcode-cn.com/problems/simplify-path/solution/java-yi-dong-yi-jie-xiao-lu-gao-by-spirit-9-18/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。