入门不容易->先从数组说起
数据结构,平时用得最多,接触最多的也是数组,先从数组说起。
数组的概念
什么是数组
一组数据,一秒钟可以申明1000个变量的骚操作。
存储相同的类型,连续的存储空间。
最重要的一点:按下标找元素。
数组是如何实现按下标访问元素的?
我们拿一个长度为5的int 类型数组 int [] arr=new int[5]; 来举例,在下面我画的这个图钟,计算机给数组arr,分配了从2000-2019的连续的内存空间,我们假设首地址是2000。下面就是寻址公式:
arr[i]_address=base_address+i*data_type_size; 因为是int类型,data_type_size大小为4。

这里有一个经常的面试考点:数组和链表的区别,很多同学会答,链表的插入和删除时间复杂度为O(n),数组的查找时间复杂度为o(1)。实际上数组的查找操作时间复杂度不是o(1)。你再好的数组,用二分查找时间复杂度都是o(logn)。正确回答,数组支持随机访问,根据下标的查询时间复杂度为o(1)。
数组的初始化方式
动态初始化:
数组类型[] 数组名 = new 数据类型[数组长度];
静态初始化:
简化格式:
数据类型[] 数组名称 = {值, 值, …};
完整格式(推荐):
数据类型[] 数组名称 = new 数据类型[]{值, 值, …};
数组是引用类型
所以下面代码输出多少?
int[] arr1 = new int[5];
int[] arr2 = new int[] { 1, 2, 3, 4, 5 }; arr1 = arr2;
arr2[2] = 8;
Console.WriteLine(arr1[2]);
数组的优缺点
支持下标索引访问,很多时候,我们的数组下标都是没有语义的,在某些情况可以让他有语义。比如特等奖对应0,奖金1000,1等奖,奖金500类似的,不过语义这个也不是啥场合都适合的,大部分场合都是不适合的。
数组内存连续存储,对CPU的缓存也很友好,性能也会更好。
固定了大小,不支持动态扩容,增加和删除数据比较麻烦。
自己实现一个数组
public class MyArray
{
//实现自己的数组
private int size;
private int defaultCapacity;
private int[] data; public MyArray():this(10)
{ } public MyArray(int defaultCapacity)
{
this.defaultCapacity = defaultCapacity;
this.data = new int[defaultCapacity];
} //添加数据逻辑,并且支持动态扩容
public void add(int ele)
{
if (size > defaultCapacity / 2)
{
//自动扩容
defaultCapacity = defaultCapacity + defaultCapacity / 2;
int[] newData = new int[defaultCapacity];
Array.Copy(this.data, newData,size);
this.data = newData;
}
this.data[size] = ele;
size++; } //打印数组
public void print()
{
for(int i = 0; i < size; i++)
{
Console.WriteLine(data[i]);
}
} //获取元素的中的个数
public int getSize()
{
return this.size;
} //删除元素
public void removeEle(int value) { //删除一个数据
int loc = -1;
for(int i = 0; i < size; i++)
{
if (data[i] == value)
{
loc = i;
break;
}
}
if (loc == -1)
{
throw new ArgumentException("没有找到要删除的元素"); }
for(int i = loc; i < size; i++)
{
data[i] = data[i + 1];
}
data[size-1] = 0; //清空数组
size--; } //删除数据根据索引
public void removeIndex(int index)
{
if (index < 0 || index > this.size)
{
throw new ArgumentException("索引不合法");
}
//删除数据,数据往前移动
for(int i = index; i < this.size; i++)
{
this.data[i] = this.data[i + 1];
}
this.data[size - 1] = 0; //清空数组
size--;
} //获取数组的容量
public int getCapacity(int n)
{
return this.defaultCapacity;
} //返回数组是否为空
public bool isEmpty()
{
return this.size == 0;
} //指定索引位置,添加元素。
public void insert(int index,int e)
{
//1、是否队满
if (size == data.Length)
{
throw new ArgumentException("add failed,Array is full");
}
//2、index是否合法。
if(index<0 || index > this.size)
{
throw new ArgumentException("add failed,Required index>0 and index<=size");
} //把数据向后移动
for(int i = this.size; i > index; i--)
{
this.data[i] = this.data[i-1];
}
this.data[index] = e;
size++;
} //是否包含某个元素
public bool contains(int n)
{
for(int i = 0; i < size; i++)
{
if (data[i] == n)
{
return true;
}
}
return false;
} //修改某个元素
public void set(int index,int ele)
{
if (index < 0 || index >= size)
throw new ArgumentException("Set failed. Index is illegal.");
this.data[index] = ele;
}
}
数组的面试题分享
1、实现一个支持动态扩容的数组
2、实现两个有序数组合并为一个有序数组
3、实现一个五子棋盘
4、无序数组,排序去重
5、数组的奇偶调换
6、数组无序且带有下标,排成有序,并输出下标
入门不容易->先从数组说起的更多相关文章
- 《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系
新手入门:C/C++中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指 ...
- Java基础(1)IntelliJ IDEA入门、常用快捷键和数组操作
一. IntelliJ IDEA入门 1 快捷键和技巧 智能补全代码,比如只写首字母按回车: psvm+Enter :public stactic void main(String[] args) s ...
- 后缀数组入门(二)——Height数组与LCP
前言 看这篇博客前,先去了解一下后缀数组的基本操作吧:后缀数组入门(一)--后缀排序. 这篇博客的内容,主要建立于后缀排序的基础之上,进一步研究一个\(Height\)数组以及如何求\(LCP\). ...
- [C语言入门笔记]分支结构与数组
分支结构与数组 什么是分支结构? 分支结构是用户或者程序可以选择下一步执行哪个语句 分支结构有哪些? If If Else If Else If Switch 在初学者的学习过程中第一种和第二种比较普 ...
- PHP基础入门(四)---PHP数组实用基础知识
PHP数组 数组是特殊的变量,它可以同时保存一个以上的值. ***关键词:数组基础.数组遍历.超全局数组.数组功能.数组函数. 下面来和大家分享一下有关PHP的数组基础知识,希望对你PHP的学习有所帮 ...
- Java入门篇(四)——数组
上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...
- Java入门(六):数组
数组是一种数据结构,用于存储同一类型值的集合,也可以看做是数据类型一致的一组数据. 一.语法和声明数组 1.语法:数据类型[ ] array = new 数据类型[长度]: 注意: 使用长度创建数组的 ...
- ES6_入门(4)_数组的解构赋值
//2017/7/14 //变量的解构赋值(解构:Destructuring) //(1)数组的解构赋值 let [a,b,c]=[1,2,3];//模式匹配,只要等号两边的模式相同,左边的变量就会被 ...
- hdu 1277 AC自动机入门(指针版和数组版)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...
- Kotlin入门(4)声明与操作数组
上一篇文章介绍了基本变量类型在Kotlin中的用法,不过这只针对单个变量,如果要求把一组相同类型的变量排列起来,形成一个变量数组,那又该如何声明和操作呢? 在Java中声明数组,跟在C语言中声明是一样 ...
随机推荐
- java接口应用
1 package face_09; 2 /* 3 * 笔记本电脑使用. 4 * 为了扩展笔记本的功能,但日后出现什么功能设备不知道. 5 * 6 * 定义了一个规则,只要日后出现的设备都符合这个规则 ...
- IoC容器-Bean管理(bean生命周期)
1,生命周期 即从对象创建到对象销毁的过程 2,bean生命周期 (1)通过构造器创建bean实例(无参数构造) (2)为bean的属性设置值和对其他bean的引用(调用set方法) (3)调用bea ...
- SQL 语句实战演练
1 创建数据库.删除数据库 备注:关键字不一定要大写. CREATE DATABASE sql_testDROP DATABASE sql_test 2 新建表 CREATE TABLE `emp` ...
- 计算机电子书 2020 CDNDrive 备份(预览版 II)
下载方式 pip install CDNDrive # 或 # pip install git+https://github.com/apachecn/CDNDrive cdrive download ...
- JAVA多线程学习六-守护线程
java中的守护程序线程是一个服务提供程序线程,它为用户线程提供服务. 它的生命依赖于用户线程,即当所有用户线程都死掉时,JVM会自动终止该线程. 有许多java守护程序线程自动运行,例如 gc,fi ...
- 利用纯代码写出一个秒表表盘的方法 —— #DF
@interface ViewController () @property (nonatomic, strong) CALayer *secLayer; // 秒针layer @property ( ...
- iis7下的php实现urlrewrite,并隐藏index.php
1 <rewrite> 2 <rules> 3 <rule name="OrgPage" stopProcessing="true" ...
- LVS+Keepalived群集
LVS+Keepalived群集 目录 LVS+Keepalived群集 一.Keepalived实现原理 1. 单服务器的风险 2. Keepalived工具 3. Keepalived解决单点故障 ...
- shell——trap捕捉信号(附信号表)
trap捕捉信号有三种形式 第一种:trap "commands" signal-list 当脚本收到signal-list清单内列出的信号时,trap命令执行双引号中的命令. 例 ...
- Scala变量和数据类型
一.注释及代码规范 Scala的注释和Java中完全相同:单行注释:// .多行注释:/* */ 以及文档注释:/** */: 使用tab操作,实现缩进,默认整体向右边移动,用shift+tab整 ...