Ива обнови решението на 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 ""
+}
Доста добро решение но можеш да го посъкратиш.
- Яко е, че си решила да си менажираш сама контейнер за стринговете но не е нужно. Можеш просто да напишеш stack := []string{} и да ползваш слайсове за поп и обикновен append за пуш. Така няма да мислиш за random lucky number. :)
- Изхода доста ме изкефи, като с програмист, но ще те посъветвам да се стараеш фунцията да връща каквото е дадено на примера. Иначе няма да ти минат тестовете и ще е тъжно да се случи на работещо решение.
Мерси за коментара!
Много ми се пишеше стек сама и затова малко ненужно усложних задачата. :) Ще гледам да я опростя наистина.
За втория коментар - малко не разбирам. Заради println-ите ли е забележката, че изходът не е коректен, или има нещо друго?
Да махни махни всички принтове освен този с резултата. Има предоставени примерни тестове подобни на тези които се използват за оценяване на домашните. Изполвай ги и ще откриеш проблема сама :)