Leetcode-字符串操作


q6 N字形变换


题目传送门


题解

这道题一看就是一道模拟题,找到规律做的会比较快,我看到一位大佬比较简便的做法。做法是先开一个二维数组(字符串数组),然后把相同的一行存到二维数组中的同一行中,那怎么确定同一行的下标呢?
我们以一个V型的字符串个数为一个周期n,n就等于2 * numRows - 2, 那么这个周期中每个字符在二维数组中的下标就是min(i%n, n - i%n)。如下图所示:

在这里插入图片描述

最后用strings.Join函数将二维数组中的字符拼接为一个字符串。

func convert(s string, numRows int) string {
	if numRows == 1 {
		return s
	}
	// 二维数组。把Z型字符串同一行的字符存到同一行中
	rows := make([]string, numRows)
	// 计算V型字符串的周期
	n := 2 * numRows - 2
	for i, char := range s {
		// 某个字符的下标应该是min(x, n - x)
		x := i % n
		rows[min(x, n - x)] += string(char)
	}
	// 最后将每一行的字符按顺序拼接为一个字符串
	return strings.Join(rows, "")
}

func min(a, b int) int {
	if a < b {
		return a
	} else {
		return b
	}
}

q14 最长公共前缀


题目传送门


题解

这题采用纵向比较法,首先把第一个字符串当作最长公共前缀与接下来的n-1个字符串去比较,在比较的过程中如果发现被比较的字符串已经到达末尾或者当前比较的两个字符不相等,就直接返回第一个字符串长度为i - 1的前缀。如果循环全部结束,就代表所有字符串相等,直接返回第一个字符串即可。

func longestCommonPrefix(strs []string) string {
	if len(strs) == 0 {
		return ""
	}
	for i := 0; i < len(strs[0]); i++ {
		for j := 1; j < len(strs); j++ {
			if i == len(strs[j]) || strs[j][i] != strs[0][i] {
				return strs[0][:i]
			}
		}
	}
	return strs[0]
}

q763 划分字母区间


题目传送门


题解

这道题用hash表来做非常简单。首先将每个字符最后出现的位置存到hash表中,然后遍历字符串,用一个变量index储存该段字符串中的字符,出现最后一次的位置,最大的那个下标。同时一边遍历一边用index与当前循环变量做比较,如果相等,就表示这一段的所有字符在后面都没有出现过。那么当前这段的长度就是i - pre。

func partitionLabels(s string) []int {
	hashTable := make(map[byte]int)
	res := make([]int, 0)
	for i, v := range s {
		hashTable[byte(v)] = i
	}
	index := 0
	pre := -1
	for i, v := range s {
		if index < hashTable[byte(v)] {
			index = hashTable[byte(v)]
		}
		if i == index {
			index = 0
			res = append(res, i - pre)
			pre = i
		}
	}
	return res
}

剑指 Offer 05. 替换空格


题目传送门


题解

创建一个字节数组,然后遍历一遍字符串,将字符追加给字节数组即可。

func replaceSpace(s string) string {
	var res []byte
	for i := 0; i < len(s); i++ {
		if s[i] == ' ' {
			res = append(res, "%20"...)
		} else {
			res = append(res, s[i])
		}
	}
	return string(res)
}

剑指 Offer 58 - I. 翻转单词顺序


题目传送门


题解

从给定的字符串尾部开始,一个单词一个单词的遍历,遍历到一个单词就累加到结果字符串里面。

func reverseWords(s string) (res string) {
	i, j := len(s)-1, len(s)-1
	for i >= 0 {
		// 剔除右边的空格,找到单词的最后一个字母
		for i >= 0 && s[i] == ' ' {
			i--
		}
		j = i
		for i >= 0 && s[i] != ' ' {
			i--
		}
		res += s[i+1:j+1] + " "
	}
	return strings.TrimRight(res, " ")
}

剑指 Offer 58 - II. 左旋转字符串


题目传送门


题解

简单的字符串拼接,首先定义一个结果字符串str,然后先拼接给定字符串的后面部分:s[n:],接着拼接字符串的前面部分:s[:n]。就完成了给定字符串的左旋。

func reverseLeftWords(s string, n int) (str string) {
	str += s[n:]
	str += s[:n]
	return
}

func main() {
	fmt.Println(reverseLeftWords("lrloseumgh", 6))
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值