数组是存储在连续内存位置的相同变量类型的项目的集合。它是最流行和最简单的数据结构之一,通常用于实现其他数据结构。数组中的每个项目都从 0 开始索引。
每个程序员的梦想不仅是成为一名优秀的程序员,而且成为一名伟大的程序员。我们都想实现我们的目标,为了实现我们的目标,我们必须有一个伟大的计划。

我们可以通过索引值直接访问数组元素。
数组的表示可以通过其声明来定义。声明意味着为给定大小的数组分配内存。

数组可以用不同的语言以不同的方式声明。为了更好地说明,下面是一些特定于语言的数组声明。

然而,上面的声明是静态或编译时内存分配,这意味着数组元素的内存是在程序编译时分配的。这里只会分配固定大小(即方括号**[]**中提到的大小)的内存用于存储,但是我们不认为这不会与我们知道数组的大小相同的情况每次,可能会出现我们不知道数组大小的情况。如果我们声明较大的大小并存储较少数量的元素,将导致内存浪费,或者是我们声明较小的大小的情况,那么我们将不会获得足够的内存来存储其余元素。在这种情况下,静态内存分配不是首选。
假设有一个班有五名学生,如果我们必须记录他们的考试成绩,我们可以通过声明五个变量并跟踪记录来做到这一点,但如果学生人数变得非常多,那会怎样?操纵和维护数据具有挑战性。
这意味着,当我们有少量对象时,我们可以使用普通变量(v1,v2,v3,..)。但如果我们想要存储大量实例,用普通变量来管理它们就变得很困难。数组的想法是在一个变量中表示许多实例..

数组主要有两种类型:

一维数组

二维阵列

数组是一种线性数据结构。在数组中,获取值的操作需要常数时间,即 O(1)。由于数组在内存中连续分配,因此通过数组索引获取值是一种算术运算。所有算术运算都在恒定时间内完成,即O(1)。 第 i个索引的地址= 基址 + 偏移量 = 第 0个索引的地址 + i ×(一个元素的大小)
例子:

数组中的内存分配
在数组A[] = {8, 6, 7, 13, 8, 19}中
要获取索引 4 处的值,我们需要存储该索引值的内存地址。该地址可以通过进行算术运算来获得,即
索引 4 处的值的地址 = 索引 0 处的值的地址 + 4 × int的大小= 108 + 4 × 4 字节 索引 4 处的值的地址 = 124 A[4] = 地址 124 处的值 = 8
当在 Java 中使用数组而不是列表时:
当在 Python 中使用数组而不是列表时:
package main
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_main(t *testing.T) {
// 查找数组中非重复数
var arr = [...]int{2, 3, 5, 4, 5, 3, 4}
var res = arr[0]
for i := 1; i < len(arr); i++ {
res = res ^ arr[i]
}
fmt.Println(res)
}
func Test2(t *testing.T) {
// https://www.geeksforgeeks.org/find-common-elements-three-sorted-arrays/
// 查找给定三个数组中的重复元素
var ar1 = []int{1, 5, 10, 20, 40, 80}
var ar2 = []int{6, 7, 20, 80, 100}
var ar3 = []int{3, 4, 15, 20, 30, 70, 80, 120}
rest := getSameItemSlice(ar1, ar2, ar3)
fmt.Println(rest)
}
func getSameItemSlice(s1, s2, s3 []int) []int {
var x, y, z int = 0, 0, 0
var rest []int
for {
if x < len(s1) && y < len(s2) && z < len(s3) {
if s1[x] == s2[y] && s2[y] == s3[z] {
rest = append(rest, s1[x])
x++
y++
z++
} else if s1[x] < s2[y] {
x++
} else if s2[y] < s3[z] {
y++
} else {
z++
}
continue
}
break
}
return rest
}
func Test3(t *testing.T) {
// 给定一个包含 N 个元素的数组 arr,大小为 N 的数组 arr 中的多数元素是在数组中出现超过 N/2 次的元素。任务是编写一个函数 isMajority() ,它接受一个数组 (arr[] )、数组的大小 (n) 和要搜索的数字 (x) 作为参数,如果 x 是多数元素(存在超过n/2 次)。
var arr = []int{1, 2, 3, 3, 3, 3, 10}
var x = 3
rest := isMajority(arr, len(arr), x)
fmt.Println(rest)
}
func isMajority(arr []int, n, x int) bool {
var num = 0
for _, v := range arr {
if v == x {
num++
}
if num > n/2 {
return true
}
}
return false
}
func TestFindMissing(t *testing.T) {
var arr = []int{1, 2, 4, 6, 3, 7, 8}
var except = 5
// var arr = []int{1, 2, 3, 5}
// var except = 4
assert.Equal(t, except, findMissing(arr))
}
// 给定一个大小为N-1的数组arr[] ,其中整数在[1, N]范围内,任务是从前N个整数中找到丢失的数字。
// 注意:列表中没有重复项。
// 输入: arr[] = {1, 2, 4, 6, 3, 7, 8}, N = 8
// 输出: 5
// 解释: 1 到 8 之间缺少的数字是 5
func findMissing(arr []int) int {
var x = make([]int, len(arr)+1)
for _, v := range arr {
x[v-1] = 1
}
fmt.Println(x)
for index, v := range x {
if v == 0 {
return index + 1
}
}
return -1
}
func findMissing2(arr []int) int {
// 求前 n 项自然数的和
l := len(arr) + 1
totalSum := (l * (l + 1)) / 2
var sum = 0
for _, v := range arr {
sum += v
}
return totalSum - sum
}