345. 反转字符串中的元音字母-简单
题目描述:
给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现不止一次。
题解:
一眼双指针,但是go语言字符串不让原地修改,去查了才知道可以用[]byte(s)获取切片
代码(Go):
func reverseVowels(s string) string {
t := []byte(s)
n := len(t)
i, j := 0, n-1
for i < j {
for i < n && !strings.Contains("aeiouAEIOU", string(t[i])) {
i++
}
for j > 0 && !strings.Contains("aeiouAEIOU", string(t[j])) {
j--
}
if i < j {
t[i], t[j] = t[j], t[i]
i++
j--
}
}
return string(t)
}
461. 汉明距离-简单
题目描述:
两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。
给你两个整数 x 和 y,计算并返回它们之间的汉明距离。
题解:
模2取余比较是否相等,不相等距离加一。官方题解使用的异或后数一的个数做的
代码(Go):
func hammingDistance(x int, y int) int {
re := 0
for x != 0 || y != 0{
tempx := x%2
tempy := y%2
if tempx != tempy{
re++
}
x = x/2
y = y/2
}
return re
}
448. 找到所有数组中消失的数字-简单
题目描述:
给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字,并以数组的形式返回结果。
题解:
用了个切片存储所有出现过的值,最后遍历切片找到没有出现的值。官方题解采用了一个很巧妙的方法节省了空间,在原数组上进行哈希,不需要额外的空间
代码(Go):
func findDisappearedNumbers(nums []int) []int {
l := len(nums)
var sce = make([]int,l + 1)
re := []int{}
for i := 0;i < l;i++{
sce[nums[i]]++
}
for i := 1;i <= l;i++{
if sce[i] == 0{
re = append(re,i)
}
}
return re
}
22.括号生成-中等
题目描述:
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
题解:
这个题真是废了老半天力气,主要是debug时候要一个一个对比确定是哪里没有考虑到,一开始我想的是加括号无非在左边加和最外边加,结果n=3的时候就出错了,我发现右边加和左边加有时候会不一样,然后我把这种情况考虑进去后n=4又出错了,我发现还有左边两层括号右边两层括号的情况。到这我才想明白本质不是左边加括号外边加括号,本质是最左边加了个左括号之后右边的括号加在哪,最后根据右边的括号加在不同的位置写了个循环动态规划得出了答案
代码(Go):
func generateParenthesis(n int) []string {
dp := [][]string{}
for i := 0;i <= n;i++{
sce := []string{}
if i == 0{
sce = append(sce,"")
dp = append(dp,sce)
}else if i == 1{
sce = append(sce,"()")
dp = append(dp,sce)
}
if i > 1{
for j := 0;j < i;j++{
for _,vp := range dp[j]{
for _,vq := range dp[i - j - 1]{
sce = append(sce,"(" + vp + ")" + vq)
}
}
}
dp = append(dp,sce)
}
}
return dp[n]
}
总结
学到了字符串转切片,字符串containsAPI,鸽笼原理(数组原地哈希)。中等题的思考过程和最后与官方题解完全不同的动态规划方法也让我受益颇多