天天看點

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
}
           

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

繼續閱讀