0
点赞
收藏
分享

微信扫一扫

剑指Offer(第二版)之双指针系列算法

gy2006_sw 2022-05-05 阅读 77

文章目录

剑指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
在这里插入图片描述
在这里插入图片描述

举报

相关推荐

0 条评论