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

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

Към профила на Димитър Дишев

Резултати

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

Код

package main
import (
"strings"
)
func pushEmptyCellsToTheEnd(pString []string, emptyCellCounter int) []string {
for cellIndex := 0; cellIndex < len(pString)-emptyCellCounter; cellIndex++ {
if pString[cellIndex] == "" {
for secondIndex := cellIndex; secondIndex < len(pString)-1; secondIndex++ {
temp := pString[secondIndex]
pString[secondIndex] = pString[secondIndex+1]
pString[secondIndex+1] = temp
}
cellIndex--
}
}
return pString
}
func parsePath(inputString string) string {
emptyCellCounter := 0
cellsArray := strings.Split(strings.Trim(inputString, "/ "), "/")
for cellIndex := 0; cellIndex < len(cellsArray); cellIndex++ {
if cellsArray[cellIndex] == ".." || cellsArray[cellIndex] == "." {
if cellIndex-1 >= 0 && cellsArray[cellIndex-1] != ".." && cellsArray[cellIndex] == ".." {
cellsArray[cellIndex-1] = ""
emptyCellCounter++
}
cellsArray[cellIndex] = ""
emptyCellCounter++
cellsArray = pushEmptyCellsToTheEnd(cellsArray, emptyCellCounter)
cellIndex = -1
}
}
parsedString := strings.Join(cellsArray[0:len(cellsArray)-emptyCellCounter], "/")
if parsedString == "" {
return "/"
} else {
return "/" + parsedString + "/"
}
}

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

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

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

Димитър обнови решението на 14.10.2013 21:27 (преди над 4 години)

+func pushEmptyCellsToTheEnd(pString []string) []string {
+ for i := 0; i < len(pString); i++ {
+ if pString[i] == "" {
+ for j := i; j < len(pString)-1; j++ {
+ temp := pString[j]
+ pString[j] = pString[j+1]
+ pString[j+1] = temp
+ }
+ }
+ }
+ return pString
+}
+func parsePath(inputString string) string {
+
+ var count int = strings.Count(inputString, "/")
+ cellsArray := strings.SplitN(inputString, "/", count+1)
+ for i := 0; i < len(cellsArray); i++ {
+ if cellsArray[i] == ".." || cellsArray[i] == "." {
+ tempCell := cellsArray[i]
+ cellsArray[i] = ""
+ if i-1 >= 0 && cellsArray[i-1] != ".." && tempCell == ".." {
+ cellsArray[i-1] = ""
+ cellsArray = pushEmptyCellsToTheEnd(cellsArray)
+ }
+ cellsArray = pushEmptyCellsToTheEnd(cellsArray)
+ i = -1
+ }
+ pushEmptyCellsToTheEnd(cellsArray)
+ }
+ cellCount := 0
+ for i := 0; i < len(cellsArray); i++ {
+ if cellsArray[i] != "" {
+ cellCount++
+ }
+ }
+ parsedString := strings.Join(cellsArray[0:cellCount], "/")
+ if parsedString == "" {
+ return "/" + parsedString
+ } else {
+ return "/" + parsedString + "/"
+ }
+}

Първо: Прочети указанията за предаване на домашни, пусни примерните тестове и виж какво се случва. Другият съвет, който мога да ти дам е да разгледаш документацията на strings. Има функции, които ще са по подходящи за нуждите ти от тези които си използвал и ще направят кода ти по-кратък и четим.

P.S. Не кръщавай неща с имена count, i, size и тн. не носят голям смисъл при четене.

Димитър обнови решението на 15.10.2013 14:45 (преди над 4 години)

-func pushEmptyCellsToTheEnd(pString []string) []string {
- for i := 0; i < len(pString); i++ {
- if pString[i] == "" {
- for j := i; j < len(pString)-1; j++ {
- temp := pString[j]
- pString[j] = pString[j+1]
- pString[j+1] = temp
+package main
+
+import (
+ "strings"
+)
+
+func pushEmptyCellsToTheEnd(pString []string, emptyCellCounter int) []string {
+ for cellIndex := 0; cellIndex < len(pString)-emptyCellCounter; cellIndex++ {
+ if pString[cellIndex] == "" {
+ for secondIndex := cellIndex; secondIndex < len(pString)-1; secondIndex++ {
+ temp := pString[secondIndex]
+ pString[secondIndex] = pString[secondIndex+1]
+ pString[secondIndex+1] = temp
}
+ cellIndex--
}
}
return pString
}
func parsePath(inputString string) string {
-
- var count int = strings.Count(inputString, "/")
- cellsArray := strings.SplitN(inputString, "/", count+1)
- for i := 0; i < len(cellsArray); i++ {
- if cellsArray[i] == ".." || cellsArray[i] == "." {
- tempCell := cellsArray[i]
- cellsArray[i] = ""
- if i-1 >= 0 && cellsArray[i-1] != ".." && tempCell == ".." {
- cellsArray[i-1] = ""
- cellsArray = pushEmptyCellsToTheEnd(cellsArray)
+ emptyCellCounter := 0
+ cellsArray := strings.Split(strings.Trim(inputString, "/ "), "/")
+ for cellIndex := 0; cellIndex < len(cellsArray); cellIndex++ {
+ if cellsArray[cellIndex] == ".." || cellsArray[cellIndex] == "." {
+ if cellIndex-1 >= 0 && cellsArray[cellIndex-1] != ".." && cellsArray[cellIndex] == ".." {
+ cellsArray[cellIndex-1] = ""
+ emptyCellCounter++
}
- cellsArray = pushEmptyCellsToTheEnd(cellsArray)
- i = -1
+ cellsArray[cellIndex] = ""
+ emptyCellCounter++
+ cellsArray = pushEmptyCellsToTheEnd(cellsArray, emptyCellCounter)
+ cellIndex = -1
}
- pushEmptyCellsToTheEnd(cellsArray)
}
- cellCount := 0
- for i := 0; i < len(cellsArray); i++ {
- if cellsArray[i] != "" {
- cellCount++
- }
- }
- parsedString := strings.Join(cellsArray[0:cellCount], "/")
+ parsedString := strings.Join(cellsArray[0:len(cellsArray)-emptyCellCounter], "/")
if parsedString == "" {
- return "/" + parsedString
+ return "/"
} else {
return "/" + parsedString + "/"
}
}

Пооправих някои неща, смених имената на променливите, махнах единия цикъл че нямаше нужда от него, мисля че е поне малко по-добре, извинявам се че първия път не бях добавил пакета main, пуснах и тестовете. :)