ch4-2, ch4-3: review

This commit is contained in:
chai2010
2016-01-06 21:17:08 +08:00
parent 336e74c44f
commit 491d771cdd
4 changed files with 15 additions and 21 deletions

View File

@@ -32,7 +32,7 @@ fmt.Printf("%q\n", nonempty(data)) // `["one" "three"]`
fmt.Printf("%q\n", data) // `["one" "three" "three"]`
```
因此我們通常會這樣使用nonempty函數data = nonempty(data)。
因此我們通常會這樣使用nonempty函數`data = nonempty(data)`
nonempty函數也可以使用append函數實現
@@ -48,9 +48,9 @@ func nonempty2(strings []string) []string {
}
```
無論如何實現以這種方式重用一個slice一般要求最多爲每個輸入值産生一個輸出值事實上很多算法都是用來過濾或合併序列中相鄰的元素。這種slice用法是比較複雜的技巧雖然使用到了slice的一些黑魔法,但是對於某些場合是比較清晰和有效的。
無論如何實現以這種方式重用一個slice一般要求最多爲每個輸入值産生一個輸出值,事實上很多這類算法都是用來過濾或合併序列中相鄰的元素。這種slice用法是比較複雜的技巧雖然使用到了slice的一些技巧,但是對於某些場合是比較清晰和有效的。
一個slice可以原來實現一個stack。最初給定的空slice對應一個空的stack然後可以使用append函數將新的值壓入stack
一個slice可以用來模擬一個stack。最初給定的空slice對應一個空的stack然後可以使用append函數將新的值壓入stack
```Go
stack = append(stack, v) // push v
@@ -68,7 +68,7 @@ top := stack[len(stack)-1] // top of stack
stack = stack[:len(stack)-1] // pop
```
要刪除slice中間的某個元素併保存原有的元素順序可以通過內置的copy函數將後面的子slice向前一位複雜完成:
要刪除slice中間的某個元素併保存原有的元素順序可以通過內置的copy函數將後面的子slice向前依次移動一位完成:
```Go
func remove(slice []int, i int) []int {
@@ -82,7 +82,7 @@ func main() {
}
```
如果刪除元素後不用保原來順序的話,我們可以簡單的用最後一個元素覆蓋被刪除的元素:
如果刪除元素後不用保原來順序的話,我們可以簡單的用最後一個元素覆蓋被刪除的元素:
```Go
func remove(slice []int, i int) []int {
@@ -105,4 +105,3 @@ func main() {
**練習 4.6** 編寫一個函數原地將一個UTF-8編碼的[]byte類型的slice中相鄰的空格參考unicode.IsSpace替換成一個空格返迴
**練習 4.7** 脩改reverse函數用於原地反轉UTF-8編碼的[]byte。是否可以不用分配額外的內存