旋轉數組(Rotate Array)

2021-02-07 腳本之家

來源 |景禹(微信公眾號ID:LifeAtaraxia)

旋轉數組

旋轉數組分為左旋轉和右旋轉兩類,力扣 189 題為右旋轉的情況,今日分享的為左旋轉。

給定一個數組,將數組中的元素向左旋轉 k 個位置,其中 k 是非負數。

圖 0-1 數組 arr 左旋轉 k=2 個位置

原數組為 arr[] = [1,2,3,4,5,6,7] ,將其向左旋轉 2 個元素的位置,得到數組 arr[] = [3,4,5,6,7,1,2]。

推薦大家去做一下力扣 189 題右旋轉數組的題目。

方法一(臨時數組)

該方法最為簡單和直觀,例如,對數組 arr[] = [1,2,3,4,5,6,7] ,k = 2 的情況,就是將數組中的前 k 個元素移動到數組的末尾,那麼我們只需利用一個臨時的數組  temp[] 將前 k 個元素保存起來 temp[] = [1,2] ,然後將數組中其餘元素向左移動 2 個位置 arr[] = [3,4,5,6,7,6,7] ,最後再將臨時數組 temp 中的元素存回原數組,即得到旋轉後的數組 arr[] = [3,4,5,6,7,1,2] ,如圖 1-1 所示。

圖 1-1 臨時數組法

PS:編寫代碼時注意下標的邊界條件。

void rotationArray(int* arr, int k, int n) {
    int temp[k]; // 臨時數組
    int i,j;
    // 1. 保存數組 arr 中的前 k 個元素到臨時數組 temp 中
    for( i = 0;i < k;i++) {
        temp[i] = arr[i];
    }
    // 2. 將數組中的其餘元素向前移動k個位置
    for( i = 0;i < n-k; i++) {
        arr[i] = arr[i+k];
    }
    // 3. 將臨時數組中的元素存入原數組
    for( j = 0; j < k; j++) {
        arr[i++] = temp[j];
    }

複雜度分析方法二(按部就班移動法)

按部就班就是按照左旋轉的定義一步一步地移動。

對於第一次旋轉,將 arr[0] 保存到一個臨時變量 temp 中,然後將 arr[1] 中的元素移動到 arr[0] ,arr[2] 移動到 arr[1] 中,...,以此類推,最後將 temp 存入 arr[n-1] 當中。

同樣以數組 arr[] = {1,2,3,4,5,6,7} , k = 2 為例,我們將數組旋轉了 2 次

第一次旋轉後得到的數組為 arr[] = {2,3,4,5,6,7,1};

第二次旋轉後得到的數組為 arr[] = {3,4,5,6,7,1,2} 。

具體步驟如圖 2-1 所示。

圖 2-1 按部就班左旋法

實現代碼C 語言實現// c 語言實現,學習算法重要的是思想,實現要求的是基礎語法
#include
void leftRotate(int[] arr, int k, int n)
{
    int i;
    for (i = 0; i < k; i++) {
        leftRotateByOne(arr, n);
    }
}

void leftRotateByOne(int[] arr, int n) 
{
    int temp = arr[0], i;
    for (i = 0; i < n-1; i++) {
        arr[i] = arr[i+1];
    }
    arr[n-1] = temp;
}

void printArray(int arr[], int n) 

    int i; 
    for (i = 0; i < n; i++)
    {
        printf("%d ", arr[i]);         
    }
}

int main()
{
    int arr[] = {1,2,3,4,5,6,7};
    leftRotate(arr, 2, 7);
    printArray(arr, 7);
    return 0;
}
Java 實現:class RotateArray {
    void leftRotate(int arr[], int k, int n) {
        for (int i = 0; i < k; i++) {
            leftRotateByOne(arr, n);
        }
    }
    
    void leftRotateByOne(int arr[], int n) {
        int temp = arr[0];
        for (int i = 0; i < n-1; i++){
            arr[i] = arr[i+1];
        }
        arr[n-1] = temp;
    }
}
Python 實現:def leftRotate(arr, k, n):
    for i in range(k):
        leftRotateByOne(arr, n)
        
def leftRotateByOne(arr, n):
    temp = arr[0];
    for i in range(n-1):
        arr[i] = arr[i-1]
    arr[n-1] = temp

算法重要的不是實現,而是思想,但沒有實現也萬萬不能。

複雜度分析方法三(最大公約數法)

此方法是對方法二的擴展,方法二是一步一步地移動元素,此方法則是按照 n 和 k 的最大公約數移動元素。

比如,arr[] = {1,2,3,4,5,6,7,8,9,10,11,12} ,k = 3,n = 12 。

計算 gcd(3,12) = 3 ,只需要移動 3 輪就能夠得到數組中的元素向左旋轉 k 個位置的結果。

第 1 輪:i = 0 ,temp = arr[i]= arr[0] = 1 ,移動 arr[j + k] 到 arr[j] ,注意 0 <= j+k < n ;i 表示移動輪數的計數器,j 表示數組下標,如圖 3-1 所示。

圖 3-1 最大公約數法--第 1 輪

第 2 輪:i = 1 ,temp = arr[1] = 2 ,移動 arr[j + 3] 到 arr[j] , 其中  1 <= j <= 7 。如圖 3-2 所示。

圖 3-2 最大公約數法--第 2 輪

第 3 輪:i = 2 , temp = arr[2] = 3 ,移動 arr[j + 3] 到 arr[j] , 其中  2 <= j <= 8 如圖 3-3 所示。

圖 3-3 最大公約數法--第 3 輪

實現代碼C 語言#include 
// 計算 k 和 n 的最大公約數 gcd
int gcd(int a, int b){
    if(b == 0){
        return a;
    }
    else{
        return gcd(b, a % b);
    }
}

void leftRotate(int arr[], int k, int n){
    int i,j,s,temp;
    k = k % n; // 可以減少不必要的移動
    int g_c_d = gcd(k, n); // 控制外層循環的執行次數
    for(i = 0; i < g_c_d; i++){
        temp = arr[i]; // 1.將 arr[i] 保存至 temp
        j = i;
        // 2. 移動 arr[j+k] 到 arr[j]
        while(1){
            s = j + k; // 考慮將arr[j+k] 的元素移動到 arr[j]
            if (s >= n) // 排除 j+k >= n 的情況,j+k < n
                s = s - n; 
            if (s == i) 
                break; 
            arr[j] = arr[s]; 
            j = s; 
        }
        arr[j] = temp; // 3.將 temp 保存至 arr[j]
    }
}

int main() 

    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 
    int i;
    leftRotate(arr, 3, 12); 
    for(i = 0; i < 12; i++){
        printf("%d ", arr[i]);
    }
    getchar(); 
    return 0; 

while 循環裡面處理的就是將 arr[j+k] 移動到 arr[j] 的過程,比如第 1 輪移動中,s 的變化如圖 3-4 所示,注意當 s = j + k 越界時的處理,與數組下標的邊邊界值 n 進行比較,當 s >= n 時,下標越界,則 s = s - n ,繼而判斷 s == i ,如果相等則退出  while 循環,一輪移動結束:

圖 3-4 一輪旋轉數組下標的變化

自願練習:嘗試自己模擬 n = 12, k = 8 的情況 (練習後點擊下方的空白區域可查看參考答案)。



Java 實現代碼
class RotateArray {
    // 將數組 arr 向左旋轉 k 個位置
    void leftRotate(int arr[], int k, int n) {
        // 處理 k >= n 的情況,比如 k = 13, n = 12
        k = k % n;
        int i, j, s, temp; // s = j + k;
        int gcd = gcd(k, n);
        for (i = 0; i < gcd; i++) {
            // 第 i 輪移動元素
            temp = arr[i];
            j = i;
            while (true) {
                s = j + k;
                if (s >= n) {
                    s = s - n;
                }
                if (s == i) {
                    break;
                }
                arr[j] = arr[s];
                j = s;
            }
            arr[j] = temp;
        }
    }

    int gcd(int a, int b) {
        if(b == 0) {
            return a;
        }
        else{
            return gcd(b, a % b);
        }

    }

    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
        RotateArray ra = new RotateArray();
        ra.leftRotate(arr, 8, 12);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

Python 實現def leftRotate(arr, k, n):
    k = k % n
    g_c_d = gcd(k, n)
    for i in range(g_c_d):
        temp = arr[i]
        j = i
        while 1:
            s = j + k
            if s >= n:
                s = s - n
            if s == i:
                break
            arr[j] = arr[s]
            j = s
        arr[j] = temp

def gcd(a, b):
    if b == 0:
        return a
    else
        return gcd(b, a % b)

arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
n = len(arr)
leftRotate(arr, 3, n)
for i in range(n):
    print ("%d" % arr[i], end = " ")
複雜度分析方法四(塊交換法)

數組  arr[] = [1,2,3,4,5,6,7] ,其中 k = 2 ,n = 7 。

設數組 arr[0,...,n-1] 包含兩塊 A = arr[0,...,d-1]  ,B = arr[d,...,n-1] ,那麼將數組 arr 左旋 2 個位置後的結果 arr[] = [3,4,5,6,7,1,2] 就相當於將 A  和 B 進行交換,如圖 4-1 所示。

圖 4-1 塊交換法

第一步:判斷 A  和 B 的大小, A  的長度比 B 小,則將 B 分割成 BlBr 兩部分,其中  Br 的長度等於 A 的長度。交換 A 和  Br ,即原數組 ABlBr 變成了 BrBlA 。此時 A 已經放到了正確的位置,然後遞歸的處理 B 的部分,如圖 4-2 所示。

圖 4-2 塊交換法(ABlBr --> BrBlA)

第二步:遞歸處理 B 部分,此時圖 4-2 中的 Br 就是新的 ABl 就是新的 B ,判斷 A  和 B 的大小,處理與第一步類似,如圖 4-3 所示:

圖 4-3 塊交換法(遞歸處理 B 部分)

第三步:遞歸處理 B 部分,圖 4-3 中的 Br 就是新的 ABl 就是新的 B ,判斷 A  和 B 的大小, A  的長度比 B 大,將 A 分割成 AlAr 兩部分,其中 Al 的長度等於 B 的長度。交換 AlB ,則 AlArB 變成了 BArAl ,此時 B 已經回到正確的位置了;遞歸處理 A ,如圖 4-4 所示。

圖 4-4 塊交換法(第 3 步)

第四步:遞歸處理 A ,圖 4-4 中的 Al 就是新的 BAr 就是新的 A ,此時 A 的長度等於 B 的長度,直接交換 AB 即可,如圖 4-5 所示。

圖 4-5 塊交換法(遞歸處理 A 部分)

實現代碼遞歸實現

C 語言遞歸實現

#include 
// 進行塊交換,la就相當於塊A的第一個元素,lb相當於塊B的第一個元素
void swap(int arr[], int la, int lb, int d) {
    int i, temp;
    for(i = 0; i < d; i++) {
        temp = arr[la+i];
        arr[la+i] = arr[lb+i];
        arr[lb+i] = temp;
    }
}

void leftRotate(int arr[], int k, int n) {
    if(k == 0 || k == n)
        return;
    // A 和 B 的長度相等,則交換直接交換A,B
    if(n-k == k)
    {
        swap(arr, 0, n-k, k);
        return;
    }
    // A 的長度小於 B, 則將B 分割成 Bl 和 Br, ABlBr --> BrBlA
    if(k < n-k)
    {
        swap(arr, 0, n-k, k);
        leftRotate(arr, k, n-k);
    }
    else // A 的長度大於 B, 則將 A 分割為 Al 和 Ar, AlArB --> BArAl
    {
        swap(arr, 0, k, n-k);
        leftRotate(arr+n-k, 2*k-n, k);
    }
}

void printArray(int arr[], int size)
{
 int i;
 for(i = 0; i < size; i++)
  printf("%d ", arr[i]);
 printf("\n ");


int main()
{
   int arr[] = {1, 2, 3, 4, 5, 6, 7};
   leftRotate(arr, 2, 7);
   printArray(arr, 7);
   getchar();
   return 0;
}

注意: arr+n-k 表示的是一個地址值,表示 Ar 第一個元素的位置。其中數組名 arr 表示數組中第一個元素的首地址。

Java 遞歸實現代碼

import java.util.*;

class BockSwap
{
    // 對遞歸調用進行包裝
    public static void leftRotate(int arr[], int k, int n)
    {
        leftRotateRec(arr, 0, k, n);
    }

    public static void leftRotateRec(int arr[], int i, int k, int n)
    {
        // 如果被旋轉的個數為 0 或者 n,則直接退出,無需旋轉
        if(k == 0 || k == n)
            return; 
         
        // A == B 的情況,swap(A,B)
        if(n - k == k)
        {
            swap(arr, i, n - k + i, k);
            return;
        }

        // A < B,swap(A,Br), ABlBr --> BrBlA
        if(k < n - k)
        {
            swap(arr, i, n - k + i, k);
            leftRotateRec(arr, i, k, n - k);
        }
        else // A > B , swap(Al, B), AlArB-->BArAl
        {
            swap(arr, i, k, n - k);
            leftRotateRec(arr, n - k + i, 2 * k - n, k);
        }
    }

    // 列印
    public static void printArray(int arr[])
    {
        for(int i = 0; i < arr.length; i++)
            System.out.print(arr[i] + " ");
        System.out.println();
    }

    // 塊交換
    public static void swap(int arr[], int la, int lb, int d)
    {
        int i, temp;
        for(i = 0; i < d; i++) {
            temp = arr[la+i];
            arr[la+i] = arr[lb+i];
            arr[lb+i] = temp;
        }
    }

    public static void main (String[] args)
    {
        int arr[] = {1, 2, 3, 4, 5, 6, 7};
        leftRotate(arr, 2, 7);
        printArray(arr);
    }
}

Python 遞歸代碼實現

def leftRotate(arr, k, n):
    leftRotateRec(arr, 0, k, n);
 
def leftRotateRec(arr, i, k, n):
    
    if (k == 0 or k == n):
        return;

    if (n - k == k):
        swap(arr, i, n - k + i, k);
        return;
 
    if (k < n - k):
        swap(arr, i, n - k + i, k);
        leftRotateRec(arr, i, k, n - k);
    else:
        swap(arr, i, k, n - k);
        leftRotateRec(arr, n - k + i, 2 * k - n, k); 
 

def printArray(arr, size):
    for i in range(size):
        print(arr[i], end = " ");
    print();
 
def swap(arr, la, lb, d):
    for i in range(d):
        temp = arr[la + i];
        arr[la + i] = arr[lb + i];
        arr[lb + i] = temp;
 
if __name__ == '__main__':
    arr = [1, 2, 3, 4, 5, 6, 7];
    leftRotate(arr, 2, 7);
    printArray(arr, 7);
迭代實現

C 語言迭代實現代碼:

void leftRotate(int arr[], int k, int n) {
    int i, j;
    if( k == 0 || k == n ) {
        return;
    }
    
    i = k;
    j = n - k;
    while (i != j) {
        if(i < j) // A < B
        {
            swap(arr, k-i, j-i+k, i);
            j -= i;
        }
        else {
            swap(arr, k-i, k, j);
            i -= j;
        }
    }
    swap(arr, k-i, k, i);
}

Java 語言迭代實現代碼:

public static void leftRotate(int arr[], int d, int n) {
    int i, j;
    if (d == 0 || d == n)
        return;
    i = d;
    j = n - d;
    while (i != j) {
        if (i < j) {
            swap(arr, d - i, d + j - i, i);
            j -= i;
        } else {
            swap(arr, d - i, d, j);
            i -= j;
        }
    }
    swap(arr, d - i, d, i);
}

Python 迭代實現代碼:

def leftRotate(arr, k, n): 
    if(k == 0 or k == n): 
        return; 
    i = k 
    j = n - k 
    while (i != j): 
         
        if(i < j): # A < B 
            swap(arr, k - i, k + j - i, i) 
            j -= i 
         
        else: # A > B
            swap(arr, k - i, k, j) 
            i -= j 
     
    swap(arr, k - i, k, i) # A == B
複雜度分析方法五(反轉法)

反轉法也可當作逆推法,已知原數組為 arr[] = [1,2,3,4,5,6,7] ,左旋 2 個位置之後的數組為 [3,4,5,6,7,1,2] ,那麼有沒有什麼方法由旋轉後的數組得到原數組呢?

首先將 [3,4,5,6,7,1,2] 反轉,如圖 5-4 所示:

圖 5-1 reverse(arr, 0, n)

然後將 [2,1] 反轉過來,將 [7,6,5,4,3] 反轉過來,得到如圖 5-2 所示的結果:

圖 5-2 reverse(arr, 0, k),reverse(arr,k,n)

數組左旋 k 個位置的算法如下,圖 5-3 所示:

leftRotate(arr[], k, n)
    reverse(arr[], 0, k);
 reverse(arr[], k, n);
 reverse(arr[], 0, n);

圖 5-3 反轉法(三步走)

實現代碼#include  
void printArray(int arr[], int size); 
void reverseArray(int arr[], int start, int end); 
  
// 將數組左旋 k 個位置
void leftRotate(int arr[], int k, int n) 

  
    if (k == 0 || k == n) 
        return; 
    // 防止旋轉參數 k 大於數組長度
    k = k % n; 
  
    reverseArray(arr, 0, k - 1); 
    reverseArray(arr, k, n - 1); 
    reverseArray(arr, 0, n - 1); 

  
// 列印輸出
void printArray(int arr[], int size) 

    int i; 
    for (i = 0; i < size; i++) 
        printf("%d ", arr[i]); 

  
// 反轉數組
void reverseArray(int arr[], int start, int end) 

    int temp; 
    while (start < end) { 
        temp = arr[start]; 
        arr[start] = arr[end]; 
        arr[end] = temp; 
        start++; 
        end--; 
    } 

  
// 主函數
int main() 

    int arr[] = { 1, 2, 3, 4, 5, 6, 7 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    int k = 2; 
  
    leftRotate(arr, k, n); 
    printArray(arr, n); 
    return 0; 
}
複雜度分析

算法就是解決問題的方法,而解決問題的方式有很多種,適合自己的才是最好的。學好算法,慢慢地大家就會發現自己處理問題的方式變了,變得更高效和完善啦!

2021 年,牛氣沖天!別忘了去 leetcode 刷 189 題呀!

  推薦閱讀:

用三國殺講分布式算法,舒適了吧?

漫畫:如何螺旋遍歷二維數組?(修訂版)

數組 vs 鍊表,到底哪個性能更強?

相關焦點

  • Js Array數組ES5/ES6常用方法
    every(function(item,index,array){}):對數組中的每一項運行給定函數,如果該函數對每一項都返回 true,則返回 true,原數組不變。>some(function(item,index,array){}):對數組的每一項運行給定函數,如果該函數對任一項返回 true,則返回 true,原數組不變。
  • 7種Js Array數組ES5/ES6常用方法
    (value, index, array) { return value > 18;}以下五種方法都接收兩個參數:要在每一項上運行的函數和(可選的)運行該函數的作用域對象——影響this的值傳入這些方法中的函數會接收三個參數:數組項的值、該項在數組中的下標和數組對象本身。
  • C 語言實例 - 數組拆分與合併
    將一個數組拆分為兩個數組,一個為奇數數組,一個為偶數數組:實例#include <stdio.h> int main(
  • javascript中數組的22種方法
    var array = [1,2,4,3,5];console.log(array,array.reverse());var array = ['str',true,3];console.log(array,array.reverse());默認情況下,sort()方法按字符串升序排列數組項,sort方法會調用每個數組項的toString
  • 旋轉數組的最小數字(劍指 Offer 題解Java版)
    旋轉數組的最小數字題目描述題目連結解題思路可以藉助下圖理解過程代碼旋轉數組的最小數字題目描述把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個非遞減排序的數組的一個旋轉,輸出旋轉數組的最小元素。
  • NumPy 數組索引、維度增加、拼接
    單維整數索引>>> import numpy as np>>>aaa = np.array(range(1,10))array([1, 2, 3, 4, 5, 6, 7, 8, 9])>>> aaa[1:5:2]array([2, 4])>>> aaa.reshape
  • Processing教程 - 類和動態數組
    比如對於教程中的雪花來說,我們定義一個雪花的類,再在其中構建雪花的位置/尺寸/速度等變量,以及它的下落/旋轉/呼吸的動態變化的函數。這些變量和動態函數都有名字,這樣代碼組織和調用起來就非常的直觀了。注意類只是一種定義,使用時還需要建立具體的對象。通過調用對象來執行具體操作。事實上,類也是「面向對象的編程概念」的核心要義。
  • revolve/rotate,哪個是「自轉」?哪個是「公轉」?
    地球的「自轉」是:rotate。The Earth rotates on its axis once every twenty-four hours. 地球每24個小時沿軸自轉一圈。rotate 和 revolve 有時也可以是同義詞?
  • JavaScript中的Array.flatMap你知道嗎?
    原文:samanthaming.com/tidbits/80-flatmap翻譯:虎克小哥哥在我以前眼裡JavaScript扁平一個數組,還是有些複雜的,不過在ES2019中引入了一種使數組扁平的新方法。並且有一個depth參數,您可以傳入任何級別的嵌套。
  • 程式設計師必知的數據結構與算法基礎:線性表數據結構之數組
    這裡我們要抽取出三個跟數組相關的關鍵詞:線性表,連續內存空間,相同數據類型;數組具有連續的內存空間,存儲相同類型的數據,正是該特性使得數組具有一個特性:隨機訪問。但是有利有弊,這個特性雖然使得訪問數組邊得非常容易但是也使得數組插入和刪除操作會變得很低效,插入和刪除數據後為了保證連續性,要做很多數據搬遷工作。
  • 【leetcode】1470.Shuffle the Array&1768.Merge Strings Alternately
    重新排列數組Given the array nums consisting of 2n elements in the form [x1,x2,...,xn,y1,y2,...,yn].Return the array in the form [x1,y1,x2,y2,...,xn,yn].給你一個數組 nums ,數組中有 2n 個元素,按 [x1,x2,...
  • 用機器學習的分類算法識別象棋棋子——兼論旋轉不變性
    識別棋子的關鍵是找到具有「旋轉不變性」的特徵——無論棋子旋轉多少度,其特徵總是穩定的。2. 圖像的矩特徵矩是概率與統計中的一個概念,是隨機變量的一種數字特徵。如果把二維灰度圖像視為有質量的平板,像素的灰度值p代表平板的密度,那麼灰度圖像就可以用二維灰度密度函數 p=f(x,y) 來表示。通過計算圖像的零階矩、一階矩、二階矩、三階矩,即可獲得被稱為不變矩的七個高度濃縮的圖像特徵。
  • PHP圖片處理之圖片旋轉和圖片翻轉實例
    圖片翻轉需要自己編寫函數來實現,而旋轉圖片則可以直接藉助GD庫中提供的imagerotate()函數完成。該函數的原型如下所示:resource  imagerotate(resource src_im ,float angle,int bgd_color ,[int ignore_transpatrent])該函數可以將src_im圖像用給定的angle角度旋轉,bgd_color指定了旋轉後沒有覆蓋到的部分的顏色。
  • 【複試上機】LeetCode-簡單-013-Maximum Subarray
    13.Maximum Subarray 動態規劃 使用動態規劃需要的前提:最優子結構性質。 發現這個問題可以用動態規劃求解: 最優子結構性質 假設數組A的最大子序和對應一個連續元素組成的數組B。
  • 不想用Object和Array存儲數據,你還有Set和Map
    · 開發人員必須根據用例選擇數組或對象。· 像Lodash這樣的第三方庫被用來增強數組的功能。隨著2015年ES6的發布,情況開始好轉。ES6引入了對Map和Set的支持,旨在克服上述限制。什麼是Set和Map?
  • 精通Excel數組公式020:MMULT數組函數
    矩陣相乘的規則1.第一個數組的行數與第二個數組的列數必須相等。2.結果數組的大小是第一個數組的行數乘以第二個數組和列數。 下圖2展示了使用MMULT函數計算女隊和男隊的總成本。可以使用MMULT函數創建與單元格區域C3:D5中預計收益數組相同大小的數組,然後傳遞組SUMPRODUCT函數,利用其忽略文本的特性。
  • Excel VBA如何定義數組,這裡有最全的數組定義方法
    Dim + 數組名定義數組用Dim關鍵字,後面的一些參數,沒有也可以,表示任意大小或任意類型的數組。Dim Arr(0 to 10)這樣就定義了一個由最小下標為0,最大下標為10的一維數組,也就是Arr數組裡面包含了從0~10的11個變量。