步步为营,蚕食数据结构与算法---数组篇

Posted cuckoonuts

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了步步为营,蚕食数据结构与算法---数组篇相关的知识,希望对你有一定的参考价值。

  数组是最基础的数据结构之一,也是很多高级数据结构的基础。

  我们简单复习一下数组的创建与遍历,先做一下热身,后面逐渐一步步实现自己的数组

  我们的开发环境主要是JDK1.8,c++11编辑工具是 jetbrains的强大开发工具 IteliJ(java),Clion(c++)

  Java版:

技术分享图片
 1 public class Main {
 2     public static void main(String[] args){
 3         int [] arr = new int[10];//init a new array with asigned prams
 4         for(int i = 0 ;i < arr.length ; i++){
 5 
 6             arr[i] = i ;
 7            System.out.println(arr[i]);}
 8         System.out.println("*****************************");
 9         int scores[] = new int[]{23,44,54};//please be noted diffrent ways of creating a new array and diffrent ways to iterate array
10 
11         for( int i = 0 ; i < scores.length ; i ++)
12             System.out.println(scores[i]);
13         System.out.println("*****************************");
14         for(int score : scores)
15             System.out.println(score);
16         System.out.println("*****************************");
17         scores[0] = 88 ;
18         for( int i = 0 ; i< scores.length ; i ++)
19             System.out.println(scores[i]);
20 
21     }
View Code

  C++版:

技术分享图片
#include <iostream>

int main() {
    int arr[10];
    for(int i = 0 ; i < 10 ; i++){
        arr[i] = i;
        std::cout << arr[i] <<" ";
    }
    std::cout << std::endl;
    int scores[] = {23,34,45};
    for(int i = 0; i < sizeof(scores)/ sizeof(int) ; i++){
        std::cout << scores[i] <<" ";
    }
    std::cout<<std::endl;
    scores[0] = 88;
    for(int i = 0 ;i  < sizeof(scores)/ sizeof(int); i++){
        std::cout << scores[i] << " ";
    }
    std::cout << std::endl;
    return 0;
}
View Code

  首先我们创造自己的数组,在Java中,要创建自己的Array类,

Java版:

技术分享图片
 1 public class Array {
 2     private int[] data;
 3     private int size;
 4     //constructor ,create Array with the input param "capacity"
 5     public Array(int capacity){
 6         data = new int[capacity];
 7         size = 0;
 8     }
 9     //constructor without params,our default capacity is 10
10     public Array(){
11         this(10);
12     }
13     //get the capacity of this array
14     public int getCapacity(){
15         return data.length;
16     }
17     //get the amount of elements of this array
18     public int getSize(){
19         return size;
20     }
21     //judge whether this array is empty or not
22     public boolean isEmpty(){
23         return size==0;
24     }
25 }
View Code

C++版:

技术分享图片
 1 class Array {
 2 private:
 3     int *data;
 4     int size;
 5     int capacity;
 6 
 7 public:
 8     Array(int capacity){
 9         data = new int[capacity];
10         size = 0 ;
11         this->capacity = capacity;
12     }
13     Array(){
14         data = new int[10];
15         size = 0 ;
16         capacity = 10;
17 
18     }
19     int getCapcity(){
20         return capacity;
21     }
22     int getSize(){
23         return size;
24 
25     }
26     bool isEmpty(){
27         return size == 0;
28     }
29 
30 };
View Code

上面的Array类并不完善,我们将对其进行改进和提升

以Java为例:我们向Array中所有元素 后面添加一个元素,则有代码:

技术分享图片
 1 public void addLast(int e){
 2         //judge whether can we add a new element
 3         if(size == data.length){
 4             throw new IllegalArgumentException("AddLust failed,the array is full");
 5         }
 6         //asign  the new last element
 7         data[size] = e ;
 8         //maintain the size of the array
 9         size ++ ;
10     }
View Code

继续我们创建为索引位置的插入一个元素的方法:

 

在插入元素时的逻辑如下:插入位置前面的元素不变,插入位置及其插入位置以后的元素均后移一位,空出的位置(也就是插入位置)插入新元素,在插入时我们采用从数组尾端开始移动,这是这段代码的巧妙所在

这时我们观察新加入的两个方法,似乎有重复,可以因为第二个方法明显包含了第一种方法,因此我们可以对代码进行优化,直接将第一种方法优化:

public void addLast(int e){

        add(size,e);
    }

同理我们也可以添加新的方法,在所有元素前面添加一个新元素:

public void addFirst(int e){
        add(0,e);
    }

获取索引位置的元素:

 

以上是关于步步为营,蚕食数据结构与算法---数组篇的主要内容,如果未能解决你的问题,请参考以下文章

指南篇0 # 数据结构与算法知识点难易重点程度表

指南篇0 # 数据结构与算法知识点难易重点程度表

指南篇0 # 数据结构与算法知识点难易重点程度表

Python数据结构与算法篇-- 滑动窗口算法

算法步步为营-两数之和

算法步步为营-两数之和