「这是我参与2022首次更文挑战的第2天,活动详情查看: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 语言使用的是值传递,即在调用过程中不会影响到实际参数
那我们就简单回顾一下,还是以本例为主
func twoSum(nums []int, target int) []int {}
nums []int, target int 分别是函数的两个参数,一个是数组,一个是int类型
那他们两个是值传递还是引用传递呢,答案是引用传递,本例中不是很明显,我们再举一个例子
package main
import (
"fmt"
)
func main() {
var a int = 100
var b int = 200
value(a, b)
fmt.Println("值传递:", a, b)
quote(&a, &b)
fmt.Print("引用传递:", a, b)
}
func value(a int, b int) {
//值传递
a = b
}
func quote(a *int, b *int) {
//引用传递
*a = *b
}
结果如下:
是不是一下子就清晰了,值传递并不会更改原变量的值,传递的其实只是一个副本,如果打印变量的地址的话,就会发现地址是不同的,引用传递则意味着直接将变量地址作为参数传递,更改则会更改原变量。
GO指针
变量是一种使用方便的占位符,用于引用计算机内存地址。
Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。
上例中quote(&a, &b)其实就是将变量a和b的内存地址作为参数传递给了函数,我们就可以通过地址去访问变量的值。
然后我们来说说指针,指针是指一个指针变量指向了一个值的内存地址
GO语言中 号用于指定变量是作为一个指针
本例中 *a = *b和 func quote(a *int, b *int) {}
均包含指针,这里提一下一个特殊的指针---空指针
当一个指针被定义后没有分配到任何变量时,它的值为 nil。
nil 指针也称为空指针。
nil和null一样,都指代零值或空值。
常用于if判断中
你以为结束了
小问题:算法中数组创建方式有几种?都有什么不同?适用于什么场景? 下一篇就讲,敬请期待
大家看完发现有什么错误,写在下面吧!跟我黑虎阿福比划比划!