Решение на Нормализация на пътища от Недялко Андреев

Обратно към всички решения

Към профила на Недялко Андреев

Резултати

  • 10 точки от тестове
  • 0 бонус точки
  • 10 точки общо
  • 8 успешни тест(а)
  • 0 неуспешни тест(а)

Код

package main
import "strings"
func parsePath(path string) string {
parts := strings.Split(path, "/")
pathLength := 0
for i := range parts {
if parts[i] == ".." {
if pathLength > 0 {
pathLength--
}
} else if parts[i] != "." && parts[i] != "" {
if pathLength != i {
parts[pathLength] = parts[i]
}
pathLength++
}
}
if pathLength > 0 {
return "/" + strings.Join(parts[:pathLength], "/") + "/"
} else {
return "/"
}
}

Лог от изпълнението

PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s
PASS
ok  	_/tmp/d20131015-29033-nnih77	0.011s

История (2 версии и 3 коментара)

Недялко обнови решението на 15.10.2013 08:21 (преди над 4 години)

+package main
+
+import "strings"
+
+func parsePath(path string) string {
+ parts := strings.Split(path, "/")
+ resultParts := make([]string, len(parts))
+ pathLength := 0
+
+ for i := range parts {
+ if parts[i] == ".." {
+ if pathLength > 0 {
+ pathLength--
+ }
+ } else if parts[i] != "." && parts[i] != "" {
+ resultParts[pathLength] = parts[i]
+ pathLength++
+ }
+ }
+
+ result := "/" + strings.Join(resultParts[:pathLength], "/")
+ if pathLength > 0 {
+ result += "/"
+ }
+
+ return result
+}

Страхотно решение. Единственото подобрение което мога да ти предложа да направиш е да замениш заделянето с make за resultParts с resultParts := []string{} и да използваш append за добавяне. Така няма да ти се налага да заделяш "голямо" количество памет в началото а то ще се добавя когато ти трябва.

Недялко обнови решението на 15.10.2013 14:16 (преди над 4 години)

package main
import "strings"
func parsePath(path string) string {
parts := strings.Split(path, "/")
- resultParts := make([]string, len(parts))
pathLength := 0
for i := range parts {
if parts[i] == ".." {
if pathLength > 0 {
pathLength--
}
} else if parts[i] != "." && parts[i] != "" {
- resultParts[pathLength] = parts[i]
+ if pathLength != i {
+ parts[pathLength] = parts[i]
+ }
pathLength++
}
}
- result := "/" + strings.Join(resultParts[:pathLength], "/")
if pathLength > 0 {
- result += "/"
+ return "/" + strings.Join(parts[:pathLength], "/") + "/"
+ } else {
+ return "/"
}
-
- return result
}