开发者学堂课程【GO 语言核心编程-基础语法、数组、切片、Map:数组复杂应用-数组反转】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/625/detail/9635
数组复杂应用-数组反转
一、数组反转实际应用
1.数组复杂使用-数组反转
(1) 要求:随机生成五个数,并将其反转打印
(2) 思路分析:通过找规律反转
2.案例:
(1) 思路:
①随机生成五个数,read.Intn()函数
②在 go 语言中使用 read.Intn 函数可以随机生成5个数
(2) read.Intn 函数的作用:
①返回一个取值范围在[0,n]的伪随机 int 值,如果n<=0会 panic。
②当我们得到随机数后,就放到一个 int 数组
③反转打印,交换的次数是 len/2,倒数第一个和第一个元素交换,倒数第二个和第二个元素交换
(3) 代码:
var intArr3 [5]int
//首先声明一个数组,此数组可以存放5个数
f
or
i
:= 0; i< len(intArr3); i++{
//循环
i
ntArr3[i] = read.Intn(100)
//随机生成一个0<=n<100的数
}
f
mt.Println(intArr)
}
还需要引入包:
“math/rand”
运行结果:[81 87 47 59 81]
生成了5个随机的数,但是随机生成的数,在每次执行的时候,生成的都是这5个数
①原因:
seed 函数:使用给定的 seed 来初始化生成器到一个确定的状态
//如果不设置一个 seed,那么当默认值一但固定后,生成的随机数将不会发生变化
//为了每次生成的随机数不一样,我们需要给一个 seed 值
rand.seed(time.Now ( ) . UnixNano())
//获取当前时间戳
还需要引入一个包:”time”
运行结果:[61 32 59 43 51]
再次运行:[7 51 18 7 58]
这时生成的数就随机了。
②注意:使用此方式生成的随机数也会出现风险,如果是按照同一秒进行生成,则生成的随机数会是相同的。因为Unix 是按照当前的秒数是进行操作的。
(4)优化:
获取纳秒:
r
and.Seed(time.Now().UnixNano())
运行结果如下:
每次生成的值也是不同的
(5)反转打印:
①在打印的时候,让数组进行交换,第一个元素和最后一个元素进行交换,倒数第二个元素和第二个元素交换,交换的次数是数组的大小除以2(len/2)。
t
emp;=0
//做一个临时变量,用于交换
for i:= 0; i<len(intArr3) / 2;i++ {
t
emp = intArr3[len(intArr3) – 1 - i]
//需要考虑动态的变化
//倒数第 n 个和第 n 个元素进行交换
//先将倒数的元素保存到一个临时变量,再将正数的第几个元素赋值到倒数的第几个元素中去,在将刚才保存的倒数的第几个元素值赋予给正数的对应的元素
intArr3[len(intArr3) – 1 - i] = intArr2[i]
intArr2[i] = temp
fmt.Println("交换前=", intArra3)
//进行交换前打印
f
mt.Println(
“交换后=”
intArr3)
//进行交换后打印
可以看到交换前和交换后不同,出现了问题
②需要将:
intArr3[len(intArr3) – 1 - i] = intArr2[i]
intArr2[i] = temp
改正为:intArr3[len(intArr3) – 1 - i] = intArr3[i]
intArr3[i] = temp
可以发现没有问题。
③由于长度计算了两次,会对程序的效率造成影响,因为 len 是一个内建函数,每次在调用内建函数时是很耗费资源的,在每调用一个函数都会开辟一个独立的数据空间。可以进行优化:len:= len(intArr3)
//单独将长度计算出来
将 len 进行替换:f
or
i
:= 0; i< len; i++{
for i:= 0; i<len / 2;i++ {
t
emp = intArr3[len – 1 - i]
intArr3[len – 1 - i] = intArr3[i]
效率更高,先将数组的长度求出,在需要使用到长度时,直接使用此变量进行处理即可。
④可以将输出进行优化:fmt.Println("交换前=
~
", intArra3)
f
mt.Println(
“交换后=~”
intArr3)
优化的原因:为了可以观察到是输出修改过后的代码
运行结果
完全正确。