跟着算法学GO(2)

158 阅读3分钟

「这是我参与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
}

结果如下:

截图_20221726061728.png

是不是一下子就清晰了,值传递并不会更改原变量的值,传递的其实只是一个副本,如果打印变量的地址的话,就会发现地址是不同的,引用传递则意味着直接将变量地址作为参数传递,更改则会更改原变量。

GO指针

变量是一种使用方便的占位符,用于引用计算机内存地址。

Go 语言的取地址符是 &,放到一个变量前使用就会返回相应变量的内存地址。

上例中quote(&a, &b)其实就是将变量a和b的内存地址作为参数传递给了函数,我们就可以通过地址去访问变量的值。

然后我们来说说指针,指针是指一个指针变量指向了一个值的内存地址

GO语言中 号用于指定变量是作为一个指针

本例中 *a = *b和 func quote(a *int, b *int) {}

均包含指针,这里提一下一个特殊的指针---空指针

当一个指针被定义后没有分配到任何变量时,它的值为 nil。

nil 指针也称为空指针。

nil和null一样,都指代零值或空值。

常用于if判断中

你以为结束了

小问题:算法中数组创建方式有几种?都有什么不同?适用于什么场景? 下一篇就讲,敬请期待

在这里插入图片描述

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