天天看点

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
}
           

@不知道时间和空间的限制是否满足,欢迎指正。

继续阅读