跟着算法学GO(4)

130 阅读3分钟

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

生命不息,学习不止

题外话

啊,回不了家了,太凄惨了,准备买点年货吧,商城都关了,心思网购买点吧,快递也停发了,人生啊…………

在这里插入图片描述

废话不多说,上货

在这里插入图片描述

LeetcCode-1

两数之和

还是这道题,因为还有东西没有说完。

题目如下:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

go实现算法

func twoSum(nums []int, target int) []int {
	result := [2]int{}  //初始化一个数组
	for i := 0; i < len(nums); i++ {   //循环
		for j := len(nums) - 1; j > i; j-- {
			if nums[i]+nums[j] == target {
				result[0] = i  //按照索引为数组赋值
				result[1] = j
				break          //中断
			}
		}
	}
	return result[:]   //返回数组
}

小问题回顾

数组的循环有几种方式?都有什么区别?

go循环

我们先来说一下go的循环语句吧

跟其他语言不太一样,go中只支持for关键字用于循环,没有while,也没有do-while

用法已经在算法实现中有所体现

  for i := 0; i < nums; i++ { 
  }
  

这里有一个注意点,go循环中的左花括号{必须与 for 处于同一行

可以看到go的for循环取消了条件表达式的(),同时go简化了无限循环的的条件,如下

for {
if 判断条件{
break
}
}

这样就开启了一个无限循环

Go语言的 for 循环同样支持 continue 和 break 来控制循环,但是它提供了一个更高级的 break,可以选择中断哪一个循环,案例如下

func twoSum(nums []int, target int) []int {
	result := [2]int{} //初始化一个数组

To:
	for i := 0; i < len(nums); i++ { //循环
		for j := len(nums) - 1; j > i; j-- {
			if nums[i]+nums[j] == target {
				result[0] = i //按照索引为数组赋值
				result[1] = j
				break To //中断
			}
		}
	}
	return result[:] //返回数组
}

使用的还是算法的实现,可以看到break可以跳出指定循环,TO在最外层,所以break可以跳出最外层循环

同时go可以将for的条件表达式转变为判断表达式,从而开启一个循环,如下

 for i <= 10 {
 i++
 }

增强for循环(键值循环)

go中也提供了一种类型foreach的迭代器——for range,可以遍历数组、切片、字符串、map 及通道(channel,使用方法入下

for key, val := range arr {
//执行语句
}

有一个要注意的点,val 始终为集合中对应索引的值拷贝,因此只具有只读性质,对val的任何修改等操作不会影响集合中原有值。

当我们只需要索引(key)或值(val)时,可以匿名不需要的变量,如下

for _, val := range arr {  //只取值
//执行语句
}

for key, _ := range arr {  //只取索引
//执行语句
}

goto

go语言中可以通过goto语句在代码间进行无条件跳转,也可快速跳出循环,可以大大简化一些代码的实现过程,同时goto还可以做共性代码抽取,提取相同业务统一处理,例如错误处理。

你以为结束了

小问题:今天没有小问题了,打算弄一个新的算法题了,就leetcode第三题吧,#### 无重复字符的最长子串

下一篇就讲,敬请期待

在这里插入图片描述

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