golang 面試題(七)小米麪試題,字符串

題目1:

給出一個字符串s(僅含有小寫英文字母和括號)。

請你按照從括號內到外的順序,逐層反轉每對匹配括號中的字符串,並返回最終的結果。

注意,您的結果中  不應  包含任何括號。

示例1:

輸入:s = "(abcd)"
輸出:"dcba"

示例2:

輸入:s = "(u(love)i)"
輸出:"iloveu"
s=> (uevoli) => iloveu

示例3:

輸入:s = "(i(op(pa))hs)"
輸出:"shopapi"

 

代碼:

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println(time.Now())
	//左括號asc碼爲40 右括號爲41
	//str1 := "(abcd)"
	//str2 := "(u(love)i)"
	str3 := "(i(op(pa))hs)"

	runeList := []rune(str3)

	if len(runeList) > 0 {
		start: for true {
			//最後一個左括號的下標
			leftIndex := 0
			//第一個右括號的下標
			rightIndex := 0
			//右括號一定出現在左括號右邊,記錄最後一個左括號和第一個右括號,即可找到最內層括號。
			for index,runeChar := range runeList {
				//左括號asc碼爲40
				if runeChar == 40 {
					leftIndex = index
				}
				//右括號爲41
				if runeChar == 41 {
					rightIndex = index
					//左括號左側字符串
					newLeftRune := runeList[0:leftIndex]
					//右括號右側字符串
					newRightRune := runeList[rightIndex + 1:]
					//括號內需要換順序的字符串
					inBracketsRune := runeList[leftIndex+1:rightIndex]
					inBracketsRune = stringInversion(inBracketsRune)
					runeList = append(append(newLeftRune, inBracketsRune...),newRightRune...)
					//繼續進行循環,直到找不到右括號,不進該if爲止
					goto start
				}
			}
			//如果已經沒有右括號,輸出,結束。
			fmt.Println(string(runeList))
			fmt.Println(time.Now())
			return
		}
	}
}

//字符串顛倒
func stringInversion(runeList []rune)(resultRuneList[]rune) {
	for i := 0; i < len(runeList)/2; i ++ {
		runeList[i],runeList[len(runeList) - i - 1] = runeList[len(runeList) - i - 1],runeList[i]
	}
	return runeList
}

 

題目2:

單詞消消樂

時間限制:lsec /空間限制:256MB

 

題意:
"一清二白,白頭偕老,老當益壯    ",牛牛和牛妹在玩成語接龍,但是牛妹因爲語文不好總是輸,於是她想出了一個新的遊戲去和牛牛玩,
牛妹會給牛牛n個單詞,牛妹要求牛牛將這n個單詞按照以下方式合併:


1. 從左往右合併單詞,將合併後的單詞作爲第一個單詞再與後面單詞合併
例如有三個單詞"a", "b", "c",先將"ab"合併,最後將合併後的"ab"與"c"合併得到"abc"。


2. 如果最左邊單詞結尾字母與其後面一個的單詞的開始字母相同,則最左邊單詞的結尾字母與之後一個單詞的開始字母都會抵消掉而消失,
重複上述操作直到某一個單詞爲空或者最左端的結尾字母與之後單詞的開始字母不同,然後合併這兩個單詞作爲一個單詞放置再最左邊。

例如"aab" "bac"合併之後會得到"ac"


輸入:
以vector< string >的形式給定n個單詞


輸出:
返回最終合併後的單詞。
若爲空則返回一個空串。


示例1 輸入
["aab","bac","ccd"]
輸出
"acd"
說明
"aab"與"bac"合併得到"ac"
"ac"再與"ccd"合併得到"acd"

 

代碼:

package main

import (
	"fmt"
	"time"
)

func main() {
        fmt.Println(time.Now())
	//給定的string集合
	givenStringList := []string{"aab","bac","ccd"}
	leftRune := []rune(givenStringList[0])
	//從第二個字符串開始遍歷
	for i := 1; i < len(givenStringList); i++ {
		leftRune = stringMerge(leftRune,[]rune(givenStringList[i]))
	}
	fmt.Println(string(leftRune))
        fmt.Println(time.Now())
}

//字符串合併
func stringMerge (leftRune,rightRune []rune)(resultRune []rune) {
	for true {
		//如果有左串和右串有一個被消除完了,就結束。
		if len(leftRune) <= 0 || len(rightRune) <= 0 {
			return leftRune
		}else {
			//左尾和右首相同的話,進行消除
			if leftRune[len(leftRune) - 1] == rightRune[0] {
				leftRune = leftRune[:len(leftRune)-1]
				rightRune = rightRune[1:]
			}else {
				//不相同,拼接返回
				return append(leftRune,rightRune...)
			}
		}
	}
	return resultRune
}

@不知道時間和空間的限制是否滿足,歡迎指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章