成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

java知識(shí)體系梳理-->數(shù)組

james / 1740人閱讀

摘要:知識(shí)體系梳理流程圖一維數(shù)組數(shù)組概述數(shù)組是指一組數(shù)據(jù)的集合,數(shù)組中的每個(gè)數(shù)據(jù)被稱(chēng)作元素。定義打印數(shù)組元素方法按照給定的格式打印題目分析通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)按照指定格式,打印數(shù)組元素操作。按照這種方式,數(shù)組循環(huán)多圈以后,就完成了數(shù)組元素的排序。

知識(shí)體系梳理流程圖 一維數(shù)組 1.1 數(shù)組概述

數(shù)組是指一組數(shù)據(jù)的集合,數(shù)組中的每個(gè)數(shù)據(jù)被稱(chēng)作元素。在數(shù)組中可以存放任意類(lèi)型的元素,但同一個(gè)數(shù)組里存放的元素類(lèi)型必須一致。

數(shù)組的好處

可以自動(dòng)給數(shù)組中的元素從0開(kāi)始編號(hào),方便操作這些元素。

1.2 數(shù)組的定義

在java中,可以使用以下2種格式來(lái)定義一維數(shù)組。

定義的格式1

在定義數(shù)組時(shí)只指定數(shù)組的長(zhǎng)度,由系統(tǒng)自動(dòng)為元素賦初值的方式稱(chēng)作動(dòng)態(tài)初始化。

元素類(lèi)型[] 數(shù)組名 = new 元素類(lèi)型[元素個(gè)數(shù)或者數(shù)組長(zhǎng)度];
int[] arr = new int[3];

上述語(yǔ)句就相當(dāng)于在內(nèi)存中定義了3個(gè)int類(lèi)型的變量,第一個(gè)變量的名稱(chēng)為arr[0],第二個(gè)變量的名稱(chēng)為arr[1],以此類(lèi)推,第三個(gè)變量的名稱(chēng)為arr[2],這些變量的初始值都是0。為了更好地理解數(shù)組的這種定義方式,可以將上面的一句代碼分成兩句來(lái)寫(xiě),具體如下:

int[] arr; // 聲明一個(gè)int[]類(lèi)型的變量
arr = new int[3]; // 創(chuàng)建一個(gè)長(zhǎng)度為3的數(shù)組

定義的格式2

在定義數(shù)組的同時(shí)就為數(shù)組的每個(gè)元素賦值稱(chēng)為靜態(tài)初始化。

元素類(lèi)型[] 數(shù)組名 = new 元素類(lèi)型[]{元素1, 元素2, 元素3, ......};

  int[] arr = new int[]{3, 5, 1} or
  int[] arr = {3, 5, 1};

需要注意,以下寫(xiě)法是錯(cuò)誤的:int[] arr = new int[4]{3, 5, 1}; 因?yàn)榫幾g器會(huì)認(rèn)為數(shù)組限定的元素個(gè)數(shù)[4]與實(shí)際存儲(chǔ)的元素{3, 5, 1}個(gè)數(shù)有可能不一致,存在一定的安全隱患。

1.3 數(shù)組的內(nèi)存結(jié)構(gòu)

內(nèi)存結(jié)構(gòu)簡(jiǎn)介

Java程序在運(yùn)行時(shí),需要在內(nèi)存中的分配空間。為了提高運(yùn)算效率,有對(duì)空間進(jìn)行了不同區(qū)域的劃分,因?yàn)槊恳黄瑓^(qū)域都有特定的處理數(shù)據(jù)方式和內(nèi)存管理方式。

JVM對(duì)內(nèi)存劃分5個(gè)區(qū)域

寄存器

本地方法區(qū)

方法區(qū)

運(yùn)行時(shí)存放class文件

棧內(nèi)存

用于存取局部變量,當(dāng)局部變量的作用域一旦結(jié)束,所占的內(nèi)存空間就會(huì)自動(dòng)釋放。

堆內(nèi)存

數(shù)組和對(duì)象,通過(guò)new創(chuàng)建的實(shí)例都存放在堆內(nèi)存中;

每一個(gè)實(shí)體都有內(nèi)存地址值;

堆內(nèi)存中每一個(gè)變量都有默認(rèn)的初始化值,根據(jù)元素類(lèi)型的不同,默認(rèn)初始化的值也是不一樣的,具體如下表所示:

實(shí)體不在使用時(shí),會(huì)在不確定的時(shí)間內(nèi)被垃圾回收器回收

數(shù)組內(nèi)存結(jié)構(gòu)

內(nèi)存圖

通過(guò)上面內(nèi)存圖來(lái)詳細(xì)的說(shuō)明數(shù)組在創(chuàng)建過(guò)程中內(nèi)存的分配情況。

第一行代碼 int[] arr; 聲明一個(gè)變量arr, 該變量的數(shù)據(jù)類(lèi)型為int[],即一個(gè)int類(lèi)型的數(shù)組。變量arr會(huì)在棧內(nèi)存中占用一塊內(nèi)存單元,它沒(méi)有被分配初始化值。

第二行代碼 arr = new int[3];會(huì)在堆內(nèi)存中分配一塊內(nèi)存單元,數(shù)組首地址為0x7852e922,數(shù)組中每一個(gè)元素初始化值為0,并將首地址賦值給變量arr,在程序運(yùn)行的過(guò)程中可以使用變量arr來(lái)引用數(shù)組。

1.4 數(shù)組中元素的訪(fǎng)問(wèn),賦值,遍歷

length屬性獲取數(shù)組的長(zhǎng)度

我們可以通過(guò)數(shù)組名.length的方式來(lái)獲取數(shù)組的長(zhǎng)度,即數(shù)組中元素的個(gè)數(shù)

通過(guò)索引訪(fǎng)問(wèn)數(shù)組中的元素

數(shù)組中的每一個(gè)元素都有一個(gè)索引(也可稱(chēng)為角標(biāo)),想要訪(fǎng)問(wèn)數(shù)組中的元素可以通過(guò)arr[索引]形式,值得注意的是:數(shù)組中最小的索引是0,最大的索引是數(shù)組的長(zhǎng)度-1。

public class ArrayDemo{    
   public static void main(String[] args){        
   int[] arr = new int[3]; //創(chuàng)建一個(gè)長(zhǎng)度為3的數(shù)組
   System.out.println("arr[0] = " + arr[0]); // 訪(fǎng)問(wèn)數(shù)組中第一個(gè)元素
   System.out.println("arr[1] = " + arr[1]); // 訪(fǎng)問(wèn)數(shù)組中第二個(gè)元素
   System.out.println("arr[2] = " + arr[2]); // 訪(fǎng)問(wèn)數(shù)組中第三個(gè)元素
   System.out.println("數(shù)組的長(zhǎng)度length = " + arr.length); // 獲取數(shù)組的長(zhǎng)度
   }
  }

運(yùn)行結(jié)果如下圖:

從打印結(jié)果可以看出,數(shù)組中的三個(gè)元素初始值都為0,這是因?yàn)楫?dāng)數(shù)組被成功創(chuàng)建后,數(shù)組中元素會(huì)被自動(dòng)賦予一個(gè)默認(rèn)值,根據(jù)元素類(lèi)型的不同,默認(rèn)初始化的值也是不一樣的。

為數(shù)組中的元素賦值

如果在使用數(shù)組時(shí),不想使用這些默認(rèn)初始值,也可以顯式地為這些元素賦值。

public class ArrayDemo{    
    public static void main(String[] args){        
        int[] arr = new int[4]; //創(chuàng)建一個(gè)長(zhǎng)度為4的int類(lèi)型數(shù)組
        arr[0] = 3; // 為第一個(gè)元素賦值為3
        arr[1] =  5; // 為第二個(gè)元素賦值為5
         System.out.println("arr[0] = " + arr[0]); // 訪(fǎng)問(wèn)數(shù)組中第一個(gè)元素
        System.out.println("arr[1] = " + arr[1]); // 訪(fǎng)問(wèn)數(shù)組中第二個(gè)元素
        System.out.println("arr[2] = " + arr[2]); // 訪(fǎng)問(wèn)數(shù)組中第三個(gè)元素
        System.out.println("arr[3] = " + arr[3]); // 訪(fǎng)問(wèn)數(shù)組中第三個(gè)元素
        System.out.println("數(shù)組的長(zhǎng)度length = " + arr.length); // 獲取數(shù)組的長(zhǎng)度
    }
}

運(yùn)行結(jié)果如下圖:

在上述代碼中,定義一個(gè)長(zhǎng)度為4的int類(lèi)型數(shù)組,此時(shí)數(shù)組中每個(gè)元素都為默認(rèn)初始值0。通過(guò)賦值語(yǔ)句將數(shù)組中的元素arr[0]和arr[1]分別賦值為3和5,而元素arr[2]和arr[3]沒(méi)有賦值,其值仍為0,因此打印結(jié)果中四個(gè)元素的值依次為3、5、0、0。

數(shù)組遍歷
在操作數(shù)組時(shí),經(jīng)常需要依次訪(fǎng)問(wèn)數(shù)組中的每個(gè)元素,這種操作稱(chēng)作數(shù)組的遍歷。接下來(lái)通過(guò)一個(gè)案例來(lái)學(xué)習(xí)如何使用for循環(huán)來(lái)遍歷數(shù)組。如下所示。ArrayDemo02.java

public class ArrayDemo02{
   public static void main(String[] args){
       int[] arr = new int[]{3, 6, 9, 5, 1}; // 創(chuàng)建一個(gè)數(shù)組
       // 使用for循環(huán)遍歷數(shù)組中每一個(gè)元素
       for(int index = 0; index < arr.length; index++){
           // 通過(guò)索引(角標(biāo))來(lái)訪(fǎng)問(wèn)數(shù)組中的元素
           System.out.print("arr["+ index +"]" + arr[index] + ", ");
       }
   }
}

運(yùn)行結(jié)果如下圖所示:

上述代碼中,定義一個(gè)長(zhǎng)度為5的數(shù)組arr,數(shù)組的角標(biāo)為0~4。由于for循環(huán)中定義的變量index的值在循環(huán)過(guò)程中為0~4,因此可以作為索引,依次去訪(fǎng)問(wèn)數(shù)組中的元素,并將元素的值打印出來(lái)。

1.4 數(shù)組中常見(jiàn)問(wèn)題分析

數(shù)組索引越界異常
每個(gè)數(shù)組的索引都有一個(gè)范圍,即0~length-1。在訪(fǎng)問(wèn)數(shù)組的元素時(shí),索引不能超出這個(gè)范圍,否則程序會(huì)報(bào)ArrayIndexOutOfBoundsException,如下所示。ArrayDemo03.java

public class ArrayDemo03{
    public static void main(String[] args){
        int[] arr = new int[]{3, 6, 9, 5, 1};
        System.out.println(arr[5]);         
    }
}

運(yùn)行結(jié)果如下:

上圖運(yùn)行結(jié)果中所提示的錯(cuò)誤信息是數(shù)組角標(biāo)越界異常ArrayIndexOutOfBoundsException,出現(xiàn)這個(gè)異常的原因是數(shù)組的長(zhǎng)度為5,其索引范圍為0~4。

空指針異常
在使用變量引用一個(gè)數(shù)組時(shí),變量必須指向一個(gè)有效的數(shù)組對(duì)象,如果該變量的值為null,則意味著沒(méi)有指向任何數(shù)組,此時(shí)通過(guò)該變量訪(fǎng)問(wèn)數(shù)組中的元素會(huì)出現(xiàn)空指針異常NullPointerException。接下來(lái)通過(guò)一個(gè)案例來(lái)演示這種異常,如下所示。ArrayDemo04.java

public class ArrayDemo04{
  public static void main(String[] args){        
      int[] arr = new int[3]; // 創(chuàng)建一個(gè)長(zhǎng)度為3的int類(lèi)型數(shù)組
      arr[0] = 23; // 給數(shù)組中的第一個(gè)元素賦值為23
      System.out.println("arr[0] = " + arr[0]); // 訪(fǎng)問(wèn)數(shù)組中第一個(gè)元素
      arr = null; // 將變量arr置位null
      System.out.println("arr[0] = " + arr[0]); // 訪(fǎng)問(wèn)數(shù)組中第一個(gè)元素
  }
}

運(yùn)行的結(jié)果如下圖:

通過(guò)上圖所示的運(yùn)行結(jié)果可以看出,代碼中將變量arr置為null,再次次訪(fǎng)問(wèn)數(shù)組時(shí)就出現(xiàn)了空指針異常NullPointerException。

1.5數(shù)組中常見(jiàn)操作

獲取最值
在操作數(shù)組時(shí),經(jīng)常需要獲取數(shù)組中元素的最值(最大值或者最小值)。

    // int[] arr = {5,1,12,4,6,8,0,3};
    // 第一種寫(xiě)法
    public static int getMax(int[] arr){
        if(arr == null)
            return -1;
         // 定義一個(gè)變量記錄最大的值,默認(rèn)數(shù)組中第一個(gè)元素
        int maxElement = arr[0];
        for(int index = 1; index < arr.length; index++){
            // 如果arr[index]大于maxElement
            if(arr[index] > maxElement)
                maxElement = arr[index]; //條件成立, 將arr[index]賦值給maxElement
        }
        return maxElement;
    }
    
    // 第二種寫(xiě)法
    public static int getMax_2(int[] arr){
        if(arr == null)
            return -1;
        // 定義一個(gè)變量記錄索引值,默認(rèn)數(shù)組中第一個(gè)索引0
        int maxIndex = 0;
        for(int index = 1; index < arr.length; index++){
            // 如果arr[index]大于arr[maxElement]
            if(arr[index] > arr[maxIndex])
                maxIndex = index;//條件成立, 將index賦值給maxIndex
        }        
        return arr[maxIndex];
    }

運(yùn)行結(jié)果:maxElement = 12
上述代碼中,定義一個(gè)臨時(shí)變量maxElement用于記錄最大值,通過(guò)for循環(huán)遍歷數(shù)組中的每一個(gè)元素arr[index]與maxElement比較獲取最大值,并賦值給maxElement。
首先假設(shè)數(shù)組中第一個(gè)元素arr[0]為最大值,使用for循環(huán)對(duì)數(shù)組進(jìn)行遍歷,在遍歷的過(guò)程中只要遇到比maxElement還要大的元素,就講該元素賦值給maxElement,變量maxElement就能夠在for循環(huán)結(jié)束時(shí)記錄數(shù)組中的最大值。值得注意的是,在for循環(huán)中的變量index是從1開(kāi)始的,這樣寫(xiě)的原因是程序已經(jīng)假設(shè)數(shù)組中第一個(gè)元素為最大值,for循環(huán)中只需要從數(shù)組中第二個(gè)元素開(kāi)始遍歷,從而可以提高程序的運(yùn)行效率。

定義打印數(shù)組元素方法,按照給定的格式打印[11, 33, 44, 22, 55]

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)按照指定格式,打印數(shù)組元素操作。

通過(guò)循環(huán),我們可以完成數(shù)組中元素的獲取,數(shù)組名[索引]

觀察發(fā)現(xiàn),每個(gè)數(shù)組元素之間加入了一個(gè)逗號(hào)”,”進(jìn)行分隔;并且,整個(gè)數(shù)組的前后有一對(duì)中括號(hào)”[]”包裹數(shù)組所有元素。

解題步驟

使用輸出語(yǔ)句完成打印 左邊的中括號(hào)”[”

使用循環(huán),輸出數(shù)組元素值。輸出元素值分為兩種情況,如下:

最后一個(gè)數(shù)組元素,加上一個(gè)右邊的中括號(hào)”]”

非最后一個(gè)數(shù)組元素,加上一個(gè)逗號(hào)”,”

//按照指定的格式打印數(shù)組
public static void toArray(int[] arr){
        System.out.print("[");
        for(int index = 0; index < arr.length; index++){
            if(index == arr.length - 1)
                System.out.print(arr[index] + "]");
            else
                System.out.print(arr[index] + ", ");
        }
    }

數(shù)組元素的逆序

圖解

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)原數(shù)組元素倒序存放操作。即原數(shù)組存儲(chǔ)元素為{23,34,45,56,67,78,89},逆序后為原數(shù)組存儲(chǔ)元素變?yōu)閧89,78,67,56,45,34,23}。

通過(guò)圖解發(fā)現(xiàn),想完成數(shù)組元素逆序,其實(shí)就是把數(shù)組中索引為start與end的元素進(jìn)行互換;

每次互換后,start索引位置后移,end索引位置前移,再進(jìn)行互換;

直到start位置超越了end位置,互換結(jié)束,此時(shí),數(shù)組元素逆序完成。

解題步驟

定義兩個(gè)索引變量start值為0,變量end值為數(shù)組長(zhǎng)度減去1(即數(shù)組最后一個(gè)元素索引);

使用循環(huán),完成數(shù)組索引start位置元素與end位置元素值互換;

在循環(huán)換過(guò)程中,每次互換結(jié)束后,start位置后移1,end位置前移1;

在循環(huán)換過(guò)程中,最先判斷start位置是否超越了end位置,若已超越,則跳出循環(huán)

    // 數(shù)組元素的逆序
    public static void reverseArray(int[] arr){
        for(int start = 0, end = arr.length - 1; start < end; start++, end--){
            int temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;
        }
    }

數(shù)組元素選擇排序

圖解

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)把數(shù)組元素{13,46,22,65,3}進(jìn)行排序。

提到數(shù)組排序,就要進(jìn)行元素值大小的比較,通過(guò)上圖發(fā)現(xiàn),我們想完成排序要經(jīng)過(guò)若干次的比較才能夠完成;

上圖中用每圈要比較的第一個(gè)元素與該元素后面的數(shù)組元素依次比較到數(shù)組的最后一個(gè)元素,把小的值放在第一個(gè)數(shù)組元素中,數(shù)組循環(huán)一圈后,則把最小元素值互換到了第一個(gè)元素中;

3數(shù)組再循環(huán)一圈后,把第二小的元素值互換到了第二個(gè)元素中。按照這種方式,數(shù)組循環(huán)多圈以后,就完成了數(shù)組元素的排序。這種排序方式我們稱(chēng)為選擇排序。

解題步驟

使用for循環(huán)(外層循環(huán)),指定數(shù)組要循環(huán)的圈數(shù)(通過(guò)圖解可知,數(shù)組循環(huán)的圈數(shù)為數(shù)組長(zhǎng)度 - 1);

在每一圈中,通過(guò)for循環(huán)(內(nèi)層循環(huán))完成數(shù)組要比較的第一個(gè)元素與該元素后面的數(shù)組元素依次比較到數(shù)組的最后一個(gè)元素,把小的值放在第一個(gè)數(shù)組元素中;

在每一圈中,要參與比較的第一個(gè)元素由第幾圈循環(huán)來(lái)決定。如上圖所示

進(jìn)行第一圈元素比較時(shí),要比較的第一個(gè)元素為數(shù)組第一個(gè)元素,即索引為0的元素;

進(jìn)行第二圈元素比較時(shí),要比較的第一個(gè)元素為數(shù)組第二個(gè)元素,即索引為1的元素;

依次類(lèi)推,得出結(jié)論:進(jìn)行第n圈元素比較時(shí),要比較的第一個(gè)元素為數(shù)組第n個(gè)元素,即數(shù)組索引為n-1的元素

// 選擇排序
    public static void selectSort(int[] arr){
        // 外層for循環(huán)控制數(shù)組循環(huán)的次數(shù)
        for(int i = 0; i < arr.length - 1; i++){
            // 內(nèi)層for循環(huán)用來(lái)比較元素值,將較小的值轉(zhuǎn)換到要比較的第一個(gè)元素中
            for(int j = i+1; j < arr.length; j++){
                if(arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }
    
    // 這種方式可以減置換的次數(shù),提高程序的性能
    public static void selectSort_2(int[] arr){
        for(int i = 0; i < arr.length - 1; i++){
            // 定義變量index和element分別記錄要比較的第一個(gè)元素的索引和值
            int index = i;
            int element = arr[i];
            for(int j = i + 1; j < arr.length; j++){
                // 比較獲取最小值的索引和值
                if(element > arr[j]){
                    index = j;
                    element = arr[j];
                }
            }
            // 當(dāng)?shù)谝粋€(gè)要比較的元素索引不等于最小值的索引置換位置
            if(index != i){
                int temp = arr[i];
                arr[i] = arr[index];
                arr[index] = temp;
            }
        }
    }

數(shù)組元素冒泡排序

圖解

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)把數(shù)組元素{13,46,22,65,3}進(jìn)行排序

提到數(shù)組排序,就要進(jìn)行元素值大小的比較,通過(guò)上圖發(fā)現(xiàn),我們想完成排序要經(jīng)過(guò)若干次的比較才能夠完成;

上圖中相鄰的元素值依次比較,把大的值放后面的元素中,數(shù)組循環(huán)一圈后,則把最大元素值互換到了最后一個(gè)元素中。數(shù)組再循環(huán)一圈后,把第二大的元素值互換到了倒數(shù)第二個(gè)元素中。按照這種方式,數(shù)組循環(huán)多圈以后,就完成了數(shù)組元素的排序。這種排序方式我們稱(chēng)為冒泡排序。

解題步驟

使用for循環(huán)(外層循環(huán)),指定數(shù)組要循環(huán)的圈數(shù)(通過(guò)圖解可知,數(shù)組循環(huán)的圈數(shù)為數(shù)組長(zhǎng)度 - 1);

在每一圈中,通過(guò)for循環(huán)(內(nèi)層循環(huán))完成相鄰的元素值依次比較,把大的值放后面的元素中;

每圈內(nèi)層循環(huán)的次數(shù),由第幾圈循環(huán)來(lái)決定。如上圖所示

進(jìn)行第一圈元素比較時(shí),內(nèi)層循環(huán)次數(shù)為數(shù)組長(zhǎng)度 - 1;

進(jìn)行第二圈元素比較時(shí),內(nèi)層循環(huán)次數(shù)為數(shù)組長(zhǎng)度 - 2;

依次類(lèi)推,得出結(jié)論:進(jìn)行第n圈元素比較時(shí),內(nèi)層循環(huán)次數(shù)為數(shù)組長(zhǎng)度 - n

    // 冒泡排序
        public static void bubbleSort(int[] arr){
            // 外層for循環(huán)控制數(shù)組循環(huán)的次數(shù)
            for(int i = 0; i < arr.length - 1; i ++){
                // arr.length - 1 為了避免角標(biāo)越界
                // arr.length - 1 - i 為了比較效率,減少重復(fù)比較
                // 內(nèi)層for循環(huán)用來(lái)比較元素值,把大的元素置換到后面
                for(int j = 0; j < arr.length - 1 - i; j++){
                    if(arr[j] > arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }
        }

數(shù)組元素普通查找

圖解

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)查找指定數(shù)值第一次在數(shù)組中存儲(chǔ)的位置(索引),返回該位置(索引)

我們可以通過(guò)遍歷數(shù)組,得到每個(gè)數(shù)組元素的值;

在遍歷數(shù)組過(guò)程中,使用當(dāng)前數(shù)組元素值與要查找的數(shù)值進(jìn)行對(duì)比

數(shù)值相等,返回當(dāng)前數(shù)組元素值的索引;

整個(gè)循環(huán)結(jié)束后,比對(duì)結(jié)果數(shù)值沒(méi)有相等的情況,說(shuō)明該數(shù)組中沒(méi)有存儲(chǔ)要查找的數(shù)值,此時(shí),返回一個(gè)索引值-1,來(lái)表示沒(méi)有查詢(xún)到對(duì)應(yīng)的位置。(使用 -1來(lái)表示沒(méi)有查詢(xún)到,是因?yàn)閿?shù)組的索引沒(méi)有負(fù)數(shù))。

解題步驟

使用for循環(huán),遍歷數(shù)組,得到每個(gè)數(shù)組元素值;

在每次循環(huán)中,使用if條件語(yǔ)句進(jìn)行當(dāng)前數(shù)組元素值與要查找的數(shù)值進(jìn)行對(duì)比,若比較結(jié)果相等,直接返回當(dāng)前數(shù)組元素的索引值;

若整個(gè)循環(huán)結(jié)束后,比對(duì)結(jié)果數(shù)值沒(méi)有相等的情況,說(shuō)明該數(shù)組中沒(méi)有存儲(chǔ)要查找的數(shù)值,此時(shí),返回一個(gè)索引值-1

// 普通查找
    public static int getArrayIndex(int[] arr, int key){
        // 把數(shù)組中的元素依次與指定的值比較
        for(int i = 0; i < arr.length - 1; i++){
            // 如果相等,找到了直接返回
            if(key == arr[i])
                return i;
        }
        return -1;
    }

數(shù)組元素二分查找(折半查找)

圖解

題目分析:通過(guò)觀察發(fā)現(xiàn),要實(shí)現(xiàn)查找指定數(shù)值在元素有序的數(shù)組中存儲(chǔ)的位置(索引),返回該位置(索引)。

我們使用數(shù)組最中間位置的元素值與要查找的指定數(shù)值進(jìn)行比較,若相等,返回中間元素值的索引

最中間位置的元素值與要查找的指定數(shù)值進(jìn)行比較,若不相等,則根據(jù)比較的結(jié)果,縮小查詢(xún)范圍為上次數(shù)組查詢(xún)范圍的一半;再根據(jù)新的查詢(xún)范圍,更新最中間元素位置,然后使用中間元素值與要查找的指定數(shù)值進(jìn)行比較。

比較結(jié)果相等,返回中間元素值的索引

比較結(jié)果不相等,繼續(xù)縮小查詢(xún)范圍為上次數(shù)組查詢(xún)范圍的一半,更新最中間元素位置,繼續(xù)比較,依次類(lèi)推。

當(dāng)查詢(xún)范圍縮小到小于0個(gè)元素時(shí),則指定數(shù)值沒(méi)有查詢(xún)到,返回索引值-1。

解題步驟

定義3個(gè)用來(lái)記錄索引值的變量,變量min記錄當(dāng)前范圍最小索引值,初始值為0;變量max記錄當(dāng)前范圍最大索引值,初始值為數(shù)組長(zhǎng)度-1;變量mid記錄當(dāng)前當(dāng)前范圍最中間元素的索引值,初始值為(min+max) / 2;

使用循環(huán),判斷當(dāng)前范圍下,最中間元素值與指定查找的數(shù)值是否相等

若相等,結(jié)束循環(huán),返回當(dāng)前范圍最中間元素的索引值mid;

若不相等,根據(jù)比較結(jié)果,縮小查詢(xún)范圍為上一次查詢(xún)范圍的一般

中間元素值 比 要查詢(xún)的數(shù)值大,說(shuō)明要查詢(xún)的數(shù)值在當(dāng)前范圍的最小索引位置與中間索引位置之間,此時(shí),更新查詢(xún)范圍為:范圍最大索引值 = 上一次中間索引位置 -1;

中間元素值 比 要查詢(xún)的數(shù)值小,說(shuō)明要查詢(xún)的數(shù)值在當(dāng)前范圍的最大索引位置與中間索引位置之間,此時(shí),更新查詢(xún)范圍為:范圍最小索引值 = 上一次中間索引位置 +1;

在新的查詢(xún)范圍中,更新中間元素值的位置,再次使用最中間元素值與指定查找的數(shù)值是否相等,中間索引值 = (范圍最小索引值 +范圍最大索引值) / 2;

每次查詢(xún)范圍縮小一半后,使用if語(yǔ)句判斷,查詢(xún)范圍是否小于0個(gè)元素,若小于0個(gè)元素,則說(shuō)明指定數(shù)值沒(méi)有查詢(xún)到,返回索引值-1

public static int binarySearch(int[] arr, int key){
        // 定義三個(gè)變量分別記錄最小、最大和中間索引
        int min, max , mid;
        min = 0;
        max = arr.length - 1;
        while(min <= max){
            mid = (min + max) >>> 2;
            
            if(arr[mid] < key)
                min = mid + 1; // 在右邊
            else if(arr[mid] > key)
                max = mid - 1; // 在左邊
            else
                return mid;    // 找到了    
        }
        // 沒(méi)有找到
        return -(min + 1);
    }
二維數(shù)組 1.1 數(shù)組定義

定義的格式1

int[][] arr = new int[3][4];

上面的代碼相當(dāng)于定義了一個(gè)3*4的二維數(shù)組,即二維數(shù)組的長(zhǎng)度為3,二維數(shù)組中的每個(gè)元素又是一個(gè)長(zhǎng)度為4的一維數(shù)組,接下來(lái)通過(guò)一個(gè)圖來(lái)表示這種情況,如下圖所示:

定義的格式2

int[][] arr = new int[3][];

二維數(shù)組中有3個(gè)一維數(shù)組,每個(gè)一維數(shù)組都有默認(rèn)的初始化值為null,可以對(duì)這個(gè)三個(gè)一維數(shù)組分別進(jìn)行初始化,接下來(lái)通過(guò)一個(gè)圖來(lái)表示這種情況,如下圖所示:

定義的格式3

int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};

定義一個(gè)名稱(chēng)為arr的二維數(shù)組,二維數(shù)組中有3個(gè)一維數(shù)組,每一個(gè)一維數(shù)組中具體元素都已初始化,接下來(lái)通過(guò)一個(gè)圖來(lái)表示這種情況,如圖所示

1.2 數(shù)組中元素的訪(fǎng)問(wèn),賦值,遍歷

對(duì)二維數(shù)組中元素的訪(fǎng)問(wèn)也是通過(guò)角標(biāo)的方式,如需訪(fǎng)問(wèn)二維數(shù)組中第一個(gè)元素?cái)?shù)組的第二個(gè)元素,具體代碼如下:arr[0][1]

獲取arr數(shù)組中所有元素的和。使用for的嵌套循環(huán)即可。

int sum = 0;
int[][] arr = {{1,2},{3,4,5,6},{7,8,9}};  
for(int i =0; i < arr.length; i++){
for(int j=0; j< arr[i].length; j++){
    sum += arr[i][j];
}
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/67906.html

相關(guān)文章

  • 通過(guò)面試題,讓我們來(lái)了解Collection

    摘要:說(shuō)一說(shuō)迭代器通過(guò)集合對(duì)象獲取其對(duì)應(yīng)的對(duì)象判斷是否存在下一個(gè)元素取出該元素并將迭代器對(duì)象指向下一個(gè)元素取出元素的方式迭代器。對(duì)于使用容器者而言,具體的實(shí)現(xiàn)不重要,只要通過(guò)容器獲取到該實(shí)現(xiàn)的迭代器的對(duì)象即可,也就是方法。 前言 歡迎關(guān)注微信公眾號(hào):Coder編程獲取最新原創(chuàng)技術(shù)文章和相關(guān)免費(fèi)學(xué)習(xí)資料,隨時(shí)隨地學(xué)習(xí)技術(shù)知識(shí)!** 本章主要介紹Collection集合相關(guān)知識(shí),結(jié)合面試中會(huì)提到...

    HelKyle 評(píng)論0 收藏0
  • Deep in JS - 收藏集 - 掘金

    摘要:今天同學(xué)去面試,做了兩道面試題全部做錯(cuò)了,發(fā)過(guò)來(lái)給道典型的面試題前端掘金在界中,開(kāi)發(fā)人員的需求量一直居高不下。 排序算法 -- JavaScript 標(biāo)準(zhǔn)參考教程(alpha) - 前端 - 掘金來(lái)自《JavaScript 標(biāo)準(zhǔn)參考教程(alpha)》,by 阮一峰 目錄 冒泡排序 簡(jiǎn)介 算法實(shí)現(xiàn) 選擇排序 簡(jiǎn)介 算法實(shí)現(xiàn) ... 圖例詳解那道 setTimeout 與循環(huán)閉包的經(jīng)典面...

    enali 評(píng)論0 收藏0
  • Java入門(mén)請(qǐng)不要放棄,學(xué)習(xí)路線(xiàn)以及側(cè)重點(diǎn)分析

    摘要:而面向搜索引擎,就是我們要及時(shí)的使用百度谷歌遇到問(wèn)題無(wú)法解決,先別急著放棄,可以去網(wǎng)絡(luò)尋找答案,你的坑大部分別人都已經(jīng)走過(guò)了,大部分都可以找到合適的解決方案。 showImg(https://segmentfault.com/img/remote/1460000019236352?w=866&h=456); 前言: ●眾多的語(yǔ)言,到底哪一門(mén)才是適合我的?●我們?yōu)槭裁匆獙W(xué)習(xí)Java語(yǔ)言呢...

    mochixuan 評(píng)論0 收藏0
  • 前端開(kāi)發(fā)收集 - 收藏集 - 掘金

    摘要:責(zé)編現(xiàn)代化的方式開(kāi)發(fā)一個(gè)圖片上傳工具前端掘金對(duì)于圖片上傳,大家一定不陌生。之深入事件機(jī)制前端掘金事件綁定的方式原生的事件綁定方式有幾種想必有很多朋友說(shuō)種目前,在本人目前的研究中,只有兩種半兩種半還有半種的且聽(tīng)我道來(lái)。 Ajax 與數(shù)據(jù)傳輸 - 前端 - 掘金背景 在沒(méi)有ajax之前,前端與后臺(tái)傳數(shù)據(jù)都是靠表單傳輸,使用表單的方法傳輸數(shù)據(jù)有一個(gè)比較大的問(wèn)題就是每次提交數(shù)據(jù)都會(huì)刷新頁(yè)面,用...

    ygyooo 評(píng)論0 收藏0
  • Python常見(jiàn)的配置文件寫(xiě)法梳理匯總

      關(guān)于Python,相比大家都不會(huì)陌生吧,那么,其中的一些配置文件是什么呢?有沒(méi)有可能給大家去進(jìn)行做一個(gè)匯總,匯總的內(nèi)容還是比較的多的,包含寫(xiě)法等一些相關(guān)的知識(shí),具體的一些相關(guān)匯總,下面給大家詳細(xì)解答下?! ∏把浴 ≡谶@篇文章里所提到的環(huán)境變量種類(lèi)其多元性由上至下到另一個(gè)先后提升:ini為何要寫(xiě)環(huán)境變量  在研發(fā)流程中,很多人都會(huì)使用一些固定不動(dòng)主要參數(shù)或者整型變量。對(duì)于這類(lèi)相對(duì)固定不動(dòng)且經(jīng)常使...

    89542767 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<