Решение на Нормализация на пътища от Ива Тотева

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

Към профила на Ива Тотева

Резултати

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

Код

package main
import (
"strings"
)
var stack []string
func parsePath(path string) string {
stack = []string{}
pathParts := strings.Split(path, "/")
for _, part := range pathParts {
if part == ".." {
pop()
} else if part != "." && part != "" {
push(part)
}
}
result := "/"
for i := 0; i < len(stack); i++ {
result += stack[i] + "/"
}
return result
}
func push(path string) {
stack = append(stack, path)
}
func pop() {
if len(stack) > 0 {
stack = stack[0 : len(stack)-1]
}
}

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

PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.023s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s
PASS
ok  	_/tmp/d20131015-29033-111o8ks	0.011s

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

Ива обнови решението на 14.10.2013 03:30 (преди над 4 години)

+package main
+
+import (
+ "fmt"
+ "strings"
+)
+
+var (
+ current int
+ stack []string
+)
+
+func parsePath(path string) string {
+ stack = make([]string, 8) //random lucky number
+ current = 0
+ pathParts := strings.Split(path, "/")
+ println("====================================")
+ for _, part := range pathParts {
+ if part == ".." {
+ pop()
+ } else if part != "." && part != "" {
+ push(part)
+ }
+ }
+
+ result := ""
+ for i := 0; i < current; i++ {
+ result += "/" + stack[i]
+ }
+ if result != "/" {
+ result += "/"
+ }
+ return result
+}
+
+func push(path string) {
+ println("pushing ", path)
+ if current == cap(stack) {
+ newStack := make([]string, current*2)
+ for k, v := range stack {
+ newStack[k] = v
+ }
+ stack = newStack
+ }
+ stack[current] = path
+ current++
+}
+
+func pop() string {
+ if current > 0 {
+ current--
+
+ temp := stack[current]
+ println("popping ", temp)
+ stack[current] = ""
+
+ return temp
+ }
+ return ""
+}

Доста добро решение но можеш да го посъкратиш.

  1. Яко е, че си решила да си менажираш сама контейнер за стринговете но не е нужно. Можеш просто да напишеш stack := []string{} и да ползваш слайсове за поп и обикновен append за пуш. Така няма да мислиш за random lucky number. :)
  2. Изхода доста ме изкефи, като с програмист, но ще те посъветвам да се стараеш фунцията да връща каквото е дадено на примера. Иначе няма да ти минат тестовете и ще е тъжно да се случи на работещо решение.

Мерси за коментара!

Много ми се пишеше стек сама и затова малко ненужно усложних задачата. :) Ще гледам да я опростя наистина.

За втория коментар - малко не разбирам. Заради println-ите ли е забележката, че изходът не е коректен, или има нещо друго?

Да махни махни всички принтове освен този с резултата. Има предоставени примерни тестове подобни на тези които се използват за оценяване на домашните. Изполвай ги и ще откриеш проблема сама :)

Ива обнови решението на 14.10.2013 19:35 (преди над 4 години)

package main
import (
- "fmt"
"strings"
)
-var (
- current int
- stack []string
-)
+var stack []string
func parsePath(path string) string {
- stack = make([]string, 8) //random lucky number
- current = 0
+ stack = []string{}
pathParts := strings.Split(path, "/")
- println("====================================")
for _, part := range pathParts {
if part == ".." {
pop()
} else if part != "." && part != "" {
push(part)
}
}
- result := ""
- for i := 0; i < current; i++ {
- result += "/" + stack[i]
+ result := "/"
+ for i := 0; i < len(stack); i++ {
+ result += stack[i] + "/"
}
- if result != "/" {
- result += "/"
- }
+
return result
}
func push(path string) {
- println("pushing ", path)
- if current == cap(stack) {
- newStack := make([]string, current*2)
- for k, v := range stack {
- newStack[k] = v
- }
- stack = newStack
- }
- stack[current] = path
- current++
+ stack = append(stack, path)
}
-func pop() string {
- if current > 0 {
- current--
-
- temp := stack[current]
- println("popping ", temp)
- stack[current] = ""
-
- return temp
+func pop() {
+ if len(stack) > 0 {
+ stack = stack[0 : len(stack)-1]
}
- return ""
-}
+}