跟着算法学GO(5)

135 阅读3分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

生命不息,学习不止

题外话

求求了,疫情快结束吧,不要新增了,再新增下去就要出不来家门了,不然回家过年还不让我出去溜达溜达嘛…………

在这里插入图片描述

废话不多说,上货

在这里插入图片描述

LeetcCode-3

无重复字符的最长子串

一道中等难度的题,难易程度适中,

题目如下:

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。

解题思路

可以很明显的看出来是一道区间类问题,也可以理解为是滑动窗口类的问题,区间类问题的核心解法就是双指针

1.采用双指针创建区间,左右指针

2.判断区间是否符合条件,不符合修改区间状态(指针移动)

3.最终输出结果

伪代码模板如下

func section(A a) type result{  //目标值A
	var result,left:=0,0  //初始化结果值和左指针
	for right:=0;reight<len(a);right++{  //初始化右指针,左右指针形成区间
            option = func check(){  //校验区间是否满足条件
		   //ToDo
	   }
		result = max(result,right-left)  //结果赋值
	}
    return result   //返回结果
}

go实现算法

func lengthOfLongestSubstring(s string) int {
	strmap := make(map[byte]int)

	count := 0
	for i, j := 0, 0; j < len(s); j++ {
		if val, ok := strmap[s[j]]; ok {
			i = max(val, i)
		}
		count = max(count, j-i+1)
		strmap[s[j]] = j + 1   //添加元素
	}
	return count
}

func max(x, y int) int {
	if x > y {
		return x
	} else {
		return y
	}
}

运行结果

image.png

有所进步了是不是,嘎嘎嘎嘎

GO为什么没有类似Math.max()/Math.min()的方法

大家都看到了,算法实现中我的max()函数是手动实现的,学过java或者其他语言的都应该知道,一般都会语言的开发者都会将这种简单且常用的方法直接写成内置函数,方便大家使用,但是GO的语言开发者就不这么想,首先他在Math中定义了一个Max()和Min(),但是它是这样的:

func Max(x, y float64) float64

func Min(x, y float64) float64

只支持float64类型,并且GO是没有方法重载的,并且开发者可能认为整数型的比较是非常简单的,自己去实现就好了,同时为了符合go这种简单整洁的风格,所以就可能并没有定义整数型的Max()和Min().

说实话,我不理解……

map集合

go中的map集合和其他语言大同小异,都是以键值对的方式存储元素,常见创建map的方式有两种,如下:

1.var map_name map[key_type]value_type

2.map_name := make(map[key_type]value_type)

算法实现中就使用了第二种方法

map添加元素在算法中有所展示,删除元素要使用delete(map_name,key_name)函数删除key和其对应的value

map的遍历可以使用增强for的的方式

 for  key,value := rang map_name{
      fmt.Print(key,"……",value)
 }
      

你以为结束了

小问题:为什么map是无序的?map的扩容机制是怎样的?底层实现又是怎样的? 下一篇就讲,敬请期待

在这里插入图片描述

大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划! 在这里插入图片描述