数据结构,平时用得最多,接触最多的也是数组,先从数组说起。

  数组的概念

     什么是数组

        一组数据,一秒钟可以申明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、数组无序且带有下标,排成有序,并输出下标

入门不容易->先从数组说起的更多相关文章

  1. 《挑战30天C++入门极限》新手入门:C/C++中数组和指针类型的关系

        新手入门:C/C++中数组和指针类型的关系 对于数组和多维数组的内容这里就不再讨论了,前面的教程有过说明,这里主要讲述的数组和指针类型的关系,通过对他们之间关系的了解可以更加深入的掌握数组和指 ...

  2. Java基础(1)IntelliJ IDEA入门、常用快捷键和数组操作

    一. IntelliJ IDEA入门 1 快捷键和技巧 智能补全代码,比如只写首字母按回车: psvm+Enter :public stactic void main(String[] args) s ...

  3. 后缀数组入门(二)——Height数组与LCP

    前言 看这篇博客前,先去了解一下后缀数组的基本操作吧:后缀数组入门(一)--后缀排序. 这篇博客的内容,主要建立于后缀排序的基础之上,进一步研究一个\(Height\)数组以及如何求\(LCP\). ...

  4. [C语言入门笔记]分支结构与数组

    分支结构与数组 什么是分支结构? 分支结构是用户或者程序可以选择下一步执行哪个语句 分支结构有哪些? If If Else If Else If Switch 在初学者的学习过程中第一种和第二种比较普 ...

  5. PHP基础入门(四)---PHP数组实用基础知识

    PHP数组 数组是特殊的变量,它可以同时保存一个以上的值. ***关键词:数组基础.数组遍历.超全局数组.数组功能.数组函数. 下面来和大家分享一下有关PHP的数组基础知识,希望对你PHP的学习有所帮 ...

  6. Java入门篇(四)——数组

    上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...

  7. Java入门(六):数组

    数组是一种数据结构,用于存储同一类型值的集合,也可以看做是数据类型一致的一组数据. 一.语法和声明数组 1.语法:数据类型[ ] array = new 数据类型[长度]: 注意: 使用长度创建数组的 ...

  8. ES6_入门(4)_数组的解构赋值

    //2017/7/14 //变量的解构赋值(解构:Destructuring) //(1)数组的解构赋值 let [a,b,c]=[1,2,3];//模式匹配,只要等号两边的模式相同,左边的变量就会被 ...

  9. hdu 1277 AC自动机入门(指针版和数组版)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1277 推荐一篇博客(看思路就可以,实现用的是java): https://www.cnblogs.co ...

  10. Kotlin入门(4)声明与操作数组

    上一篇文章介绍了基本变量类型在Kotlin中的用法,不过这只针对单个变量,如果要求把一组相同类型的变量排列起来,形成一个变量数组,那又该如何声明和操作呢? 在Java中声明数组,跟在C语言中声明是一样 ...

随机推荐

  1. golang中的排序算法实现

    1. 冒泡排序算法实现 package main import "fmt" func main() { values := []int{3, 98, 55, 46, 22, 3, ...

  2. numpy常用函数记录

    np.square() 函数返回一个新数组,该数组的元素值为源数组元素的平方. 源阵列保持不变. 示例: import numpy as np a = np.array([[1, 2, 3], [4, ...

  3. from 表单上传文件和下载?

    from表单上传单个文件的方法. 分为三个部分,简单演示. 一部分 表单上传文件 <%-- Created by IntelliJ IDEA. User: Administrator Date: ...

  4. HBuilderX频繁关闭,导致启动不了?

    根据官方给出的指南(http://ask.dcloud.net.cn/article/35583),在我的电脑打开%appdata%下面的会有HBuilderX目录,把这个目录删除或改名就可以启动了:

  5. 【第十二期】腾讯后台实习初试、复试、HR面经 (许愿OC)

    楼主投的很晚属于正常批才开始,初试面试官比较重基础,复试面试官比较看综合能力,HR小姐姐声音好听,腾讯面试官都特别nice! 一面: 看你项目很多,你挨个给我介绍一遍吧 我:一大堆按着简历介绍 日志文 ...

  6. winform 获得局域网内在线IP和计算机名,获取IP,多线程网络编程

    转载请注明来源:https://www.cnblogs.com/hookjc/ using System; using System.Collections.Generic; using System ...

  7. Python—高级函数

    Python-高级函数 一.闭包 Python函数是支持嵌套的.如果在一个内部函数中对外部函数作用域(非全局作用域)的变量进行引用,那么内部函数就会被称为闭包.闭包需要满足如下3个条件: 存在于两个嵌 ...

  8. java常用类,包装类,String类的理解和创建对象以及StringBuilder和StringBuffer之间的区别联系

    一.包装类的分类: 1.黄色部分的父类为Number 继承关系: Boolean Character 其他六个基本数据类型 2.装箱和拆箱 理解:一个例子,其他的都相同 装箱:Integer inte ...

  9. Java经典案例之用三种方法求1~100以内素数之和

    素数,不能被除了1和本身以外整除的数被称为素数.接下来我用三种方式求得1~100以内素数. 方式一 外层每循环一次,内层就计算出这个数有几个因子,我们都知道素数的因子只有两个,所以如果个数为2就加进总 ...

  10. C++职工管理系统

    目录 职工管理系统 一. 需求 二. 创建管理类 1.创建文件 2. 头文件实现 3. 源文件实现 三. 菜单功能 1. 添加成员函数 2. 功能实现 3. 测试菜单功能 四. 退出功能 1. 提供功 ...