跟着算法学GO(1)

242 阅读3分钟

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

生命不息,学习不止

题外话

项目更新,技术栈发生改变,改用go写业务啦,不想乏味的看书,看视频学语言,不如直接刷算法,在算法里学,路漫漫啊……

在这里插入图片描述 废话不多说,上货 在这里插入图片描述

LeetcCode-1

两数之和

刷过LeetCode都知道这题,入门级,但是我们的目的不只有做题,还有学习语言

题目如下:

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

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

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

示例 1:

输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

输入:nums = [3,2,4], target = 6 输出:[1,2]

示例 3:

输入:nums = [3,3], target = 6 输出:[0,1]

是不是看上去很简单,那我们就拿go来写一下吧

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[:]   //返回数组
}

保姆式注解让你一眼就能看懂

运行结果如下

截图_20221026031000.png

别看只是单纯的暴力循环,虽然效率是差了点,但咱们的核心目的是学习语言,那就开始吧

创建函数

函数是基本的代码块,用于执行一个任务, Go 语言函数定义格式如下:

func function_name( [parameter list] ) [return_types] {
   函数体
}

函数定义解析:

  • func:函数由 func 开始声明
  • function_name:函数名称,参数列表和返回值类型构成了函数签名。
  • parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。
  • return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。有些功能不需要返回值,这种情况下 return_types 不是必须的。
  • 函数体:函数定义的代码集合。 我们就拿

func twoSum(nums []int, target int) []int {}

来说

twoSum 是方法的名称

nums []int, target int 分别是函数的两个参数,一个是数组,一个是int类型

[]int 则是返回值的类型,是一个数组类型

函数的调用

当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。

调用函数,向函数传递参数,并返回值

本例中就可以在main函数中调用该函数

func main() {
	arr := []int{3, 2, 4}
	result := twoSum(arr, 6)
	fmt.Print(result[0])
	fmt.Print(result[1])
}

arr 和 6 就是对应的参数,result就是返回的数组

函数的多个返回值

go的函数还有一个优点,就是可以有多个返回值,举个例子

func twoSum(nums []int, target int) (int firnum,int secnum)

我可以将本例中返回值是数组的形式,直接改成返回两个数字,接收方式如下

a,b:=twoSum(nums, target)

你以为结束了

小问题:函数在传参是分为值传递和引用传递,go中是如何体现的? 下一篇就讲,敬请期待

在这里插入图片描述

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