数组复杂应用-数组反转|学习笔记

简介: 快速学习数组复杂应用-数组反转。

开发者学堂课程【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个数

for i := 0; i< len(intArr3); i++{  //循环

intArr3[i] = read.Intn(100)  

//随机生成一个0<=n<100的数

}

fmt.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优化:

获取纳秒:

rand.Seed(time.Now().UnixNano())

运行结果如下:

image.png

每次生成的值也是不同的

5反转打印:

在打印的时候,让数组进行交换,第一个元素和最后一个元素进行交换,倒数第二个元素和第二个元素交换,交换的次数是数组的大小除以2(len/2)。

temp;=0

//做一个临时变量,用于交换

for i:= 0; i<len(intArr3) / 2;i++ {

temp = intArr3[len(intArr3) – 1 - i]  

//需要考虑动态的变化

//倒数第 n 个和第 n 个元素进行交换

//先将倒数的元素保存到一个临时变量,再将正数的第几个元素赋值到倒数的第几个元素中去,在将刚才保存的倒数的第几个元素值赋予给正数的对应的元素

intArr3[len(intArr3) – 1 - i] = intArr2[i]  

intArr2[i] = temp

fmt.Println("交换前=", intArra3)  //进行交换前打印

fmt.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 进行替换:
for i := 0; i< len; i++{

for i:= 0; i<len / 2;i++ {

temp = intArr3[len – 1 - i]

intArr3[len – 1 - i] = intArr3[i]

效率更高,先将数组的长度求出,在需要使用到长度时,直接使用此变量进行处理即可。

④可以将输出进行优化:
fmt.Println("交换前=~", intArra3)

fmt.Println(“交换后=~”intArr3)

优化的原因:为了可以观察到是输出修改过后的代码

运行结果

完全正确。

相关文章
|
4月前
|
存储 算法 C++
c++数组详细介绍(二)
c++数组详细介绍(二)
96 0
|
4月前
|
Java
数组的练习
数组的练习
|
3月前
|
存储 开发框架 .NET
C#中的数组探索
C#中的数组探索
|
4月前
|
存储 C++ 索引
c++数组
c++数组
46 2
|
11月前
|
存储 C语言 索引
C 数组
C 数组。
34 0
|
4月前
1-9 数组
1-9 数组
20 0
|
4月前
|
存储 程序员 C++
c++数组详细介绍(一)
前言 深入理解C++的数组和字符串是成为熟练C++程序员的重要一步。本文将探索C++中数组和字符串的基本概念,从基础到进阶,包括数组的声明、初始化、访问和多维数组的操作,以及字符串类的使用和与字符数组的转换。还将涉及异常处理、动态内存分配、STL中的其他容器、常用字符串操作。
91 0
|
算法
三 数组
三 数组
51 0
|
存储 编译器 程序员
|
存储 人工智能 编译器
6.数组
6.数组
62 0