文章目录
剑指Offer(第二版)之双指针系列算法
1.剑指Offer57–和为s的两个数字
1.1哈希法(map)
func twoSum(nums []int, target int) []int {
m := make(map[int]struct{})
for _,v :=range nums{
if _,ok:=m[target-v];ok{
return []int{target-v,v}
}else {
m[v]= struct{}{}
}
}
return nil
}
1.2双指针
func twoSum(nums []int, target int) []int {
left :=0
right :=len(nums)-1
for left<right{
sum := nums[left]+nums[right]
if sum==target{
return []int{nums[left],nums[right]}
}else if sum>target{
right--
}else {
left++
}
}
return nil
}
2.剑指Offer58 I–翻转单词顺序
2.1双指针
func reverseWords(s string) string {
//1.使用双指针删除冗余的空格
slowIndex, fastIndex := 0, 0
b := []byte(s)
//删除头部冗余空格
for len(b) > 0 && fastIndex < len(b) && b[fastIndex] == ' ' {
fastIndex++
}
//删除单词间冗余空格
for ; fastIndex < len(b); fastIndex++ {
if fastIndex-1 > 0 && b[fastIndex-1] == b[fastIndex] && b[fastIndex] == ' ' {
continue
}
b[slowIndex] = b[fastIndex]
slowIndex++
}
//删除尾部冗余空格
if slowIndex-1 > 0 && b[slowIndex-1] == ' ' {
b = b[:slowIndex-1]
} else {
b = b[:slowIndex]
}
//2.反转整个字符串
reverse(b, 0, len(b)-1)
//3.反转单个单词 i单词开始位置,j单词结束位置
m:=0
for i:=0;i<len(b);i++{
if b[i]==' '{
reverse(b,m,i-1)
m=i+1
}
if i==len(b)-1{
reverse(b,m,len(b)-1)
}
}
return string(b)
}
func reverse( b []byte, left, right int) {
for left < right {
b[left], b[right] = b[right], b[left]
left++
right--
}
}
151