「这是我参与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第三题吧,#### 无重复字符的最长子串
下一篇就讲,敬请期待
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!