1. 程式人生 > >java基礎篇之5-------一維陣列的拷貝

java基礎篇之5-------一維陣列的拷貝

作業:
1、{1,2,3,4,5,6}
將奇數放在偶數前面 大小順序不要求

    public static int[] sortArray(int[] a) {
        int odd = 0;// 奇數下標
        int even = 0;// 偶數下標
        int evenNum = 0;// 偶數個數
        for (int i = 0; i < a.length; i++) {
            if (a[i] % 2 == 0) {
                even = i; // 儲存第一個偶數的下標
                evenNum++;// 個數加1
            } else {
            }
            int temp = a[i];
            a[i] = a[even - evenNum + 1];
            a[even - evenNum + 1] = temp;
            even = i;
        }
        System.out.println(Arrays.toString(a));
        return a;
    }

作業2:一個數組是有序的,給定一個key:數字 有兩個數字的和加起來等於sum, 找到這兩個數字的下標

 public static void searchIndex(int a[], int sum) {
        int i = 0, j = 1;
        for (i = 0; i < a.length; i++) {
            for (j = i + 1; j < a.length; j++) {
                if (a[i] + a[j] == sum) {
                    System.out.println(i + "***********" + j);
                }
            }
        }
    }

3: 題目:一個整形陣列,除了兩個數字只出現一次外, 其他數字都是兩次。{1,3,1,2,3,4} 找到這兩個數字

步驟:1: 將陣列中的所有數字進行異或, : 因為其他數字都是出現兩次,根據異或規律,得到的
 *                                           結果只能是兩個只出現一次的數字的異或結果temp;
 *         2:對temp的二進位制表示數進行判斷,從右往左第幾位是1;記作n;
 *         3:以n為判斷依據,將所有數字按照二進位制數字的第n位是不是1來分組,
 *         4: 將得到的兩個分組分別異或,得到的兩個數字就是結果;
import java.util.Arrays;

public class testDome4 {

    // 3: 判斷傳入的數字右移index位,然後和1相與,檢測指定位是不是1;
    public static boolean idOne(int number, int index) {
        number >>= index;
        if ((number ^ 1) == 1) {
            return true;   // 如果是0 返回true;
        } else {
            return false;  // 如果是1,返回false;
        }
    }
    
    public static int indexOfOne(int number) {
        //2:判斷所有數字異或的結果number二進位制從右往左第幾位是1;  
        int count = 0; // 設定一個計數器
        for (int i = 0; i <= 32; i++) {   //用迴圈依次與1異或  
            if ((number ^ 1) != 0 && count < 32) {    
                number >>= 1;//  如果結果是1,則把該數字向右移一位,
                count++; //  計數器+1;
            } else {
                break;  // 只需要找到第一個1就行,所以此處用的break
            }
        }
        return count;
    }

    public static int[] findNumApperOnce(int[] array) {
        // 1:將陣列中的所有數字進行異或;
        int result = 0;
        for (int i = 0; i < array.length; i++) {
            result ^= array[i];    //將結果儲存在result中,然後傳給上面的方法進行判斷1的位置
        }
        
        // 前三步工作做好之後,進行下面的操作
        int isOne = 0; //定義一個接收是1 的分組,讓其相互異或,得到的結果就是第一個數;
        int isZore = 0; // 定義一個接收是0 的分組,讓其相互異或,得到的結果就是第二個數; 
        for (int i = 0; i < array.length; i++) {
            if (idOne(array[i], indexOfOne(result))) {
                isZore ^= array[i];   // 得到第一個數字;
            } else {
                isOne ^= array[i];    // 得到第二個數字;
            }
        }
        int []resultArray=new int[2];   // 將結果儲存在新定義的陣列resultArray中!
        resultArray[0]=isZore;
        resultArray[1]=isOne;
        return  resultArray;
    }
    public  static void main(String [] args){
        int []array=new int[]{1,2,3,4,3,2,5,4};
        int []result=findNumApperOnce(array);
        System.out.println(Arrays.toString(result));
    }
}

4: 對array方法的操作:

 //往陣列指定位置插入
    public static int[] inPut(int index, int[] array, int val) {
        int[] newArray = new int[array.length + 1];
        for (int i = 0; i < index; i++) {
            newArray[i] = array[i];
        }
        System.arraycopy(array, index, newArray, index + 1, array.length - index);
        newArray[index] = val;
        return newArray;

    }

    //  找最大數
    public static int getMax(int[] arr) {
        int max = arr[0];
        for (int i = 1; i < arr.length; i++) {
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        return max;

    }

    //  找最小數
    public static int getMin(int[] arr) {
        int min = arr[0];
        for (int x = 1; x < arr.length; x++) {
            if (min > arr[x]) {
                min = arr[x];
            }
        }
        return min;

    }

    //合併陣列
    public static void content(int a[], int b[]) {
        int[] c = Arrays.copyOf(a, a.length + b.length);
        System.arraycopy(b, 0, c, a.length, b.length);
        System.out.println(Arrays.toString(c));
    }
    //刪除指定陣列中數值

    public static void del(int[] a, int val) {

        for (int i = 0; i < a.length; i++) {
            if (a[i] == val) {
                System.arraycopy(a, i + 1, a, i, a.length - i - 1);
                a[a.length - 1] = 0;
            }
        }
        System.out.println(Arrays.toString(a));
    }

    // 從陣列中查詢常見的元素:
    public static int search(int[] a, int val) {
        for (int i = 0; i < a.length; i++) {
            if (a[i] == val) {
                return i;
            }
        }
        return -1;
    }

    // 填充陣列
    public static void fill() {
        int a[] = new int[5];
        int b[] = new int[10];
        Arrays.fill(a, 500);// 將陣列a全部填充為500;
        Arrays.fill(b, 2, 6, 20);//將陣列b從下標第2個到第5個數部分填充為20 [2,6)
        System.out.println(Arrays.toString(a));
        System.out.println(Arrays.toString(b));
    }


    //可變引數程式設計  :實際上是陣列
    public static void sum(int... array) {
        int sum = 0;
        for (int i : array) {
            sum += i;
        }
    }

1:陣列克隆
(1): for迴圈克隆:(淺拷貝)

int [] a=new int[]{1,2}
int [] b=new int[2];
for(int i=0;i<a.length;i++) {
	b[i]=a[i];
	}

( 2 ) : clone();方法;(淺拷貝)
用法:

int [] a=new int[]{1,2}
int [] b=a.clone();                 //   直接呼叫clone()方法; 

(3):System.arraycopy( Object src, int srcPos, Object dest, int destPos, int length)方法: (淺拷貝)
含義: src: 原陣列;
srcPos: 原始陣列拷貝起始位置;
dest:目標陣列;
destPos:目標陣列起始位置;
length: 拷貝長度;

		 TestArray[] t1 = new TestArray[4];
        t1[0] = new TestArray();
        t1[1] = new TestArray();
        t1[2] = new TestArray();
        t1[3] = new TestArray();
        TestArray[] t2 = new TestArray[4];            //t2[0]
     	  System.arraycopy(t1,0,t2,0,t1.length);  //  把 原始陣列t1,從t1的0位置開始拷貝,目標陣列t2,從t2的0位置開始,長度為t1陣列的長度

(4) Arrays.copyof( ) 方法: (淺拷貝)
用法:

 TestArray[] t1 = new TestArray[4];
        t1[0] = new TestArray();
        t1[1] = new TestArray();
        t1[2] = new TestArray();
        t1[3] = new TestArray();
        TestArray[] t2 = Arrays.copyOf(t1,t1.length);            //    >>>>>> 第一個引數是被克隆的陣列,第二個是長度;

四種拷貝方法區別:
for迴圈 :利用迴圈依次拷貝
clone() , : 本地方法,底層用c\c++ 程式碼實現,呼叫速度快,會返回object的物件;
System.arraycopy(): 本地方法 ,使用c/c++實現,無返回值;
Arrays.copyof() : 產生泛型陣列,底層呼叫的還是arraycopy()方法,產生新的物件;
引用型別陣列拷貝堆疊分析:
在這裡插入圖片描述
2: 匿名陣列:
使用:
System.out.println(new String[]{"a","b"}); // 》》》》》這裡建立了一個匿名陣列,並列印輸出
1)、匿名陣列是一個沒有名字的陣列
2)、匿名陣列與普通的陣列的語法是一樣的,如:new [] { },不同的是建立完陣列後不會儲存在任何一個變數身上。
3)、使用匿名陣列的策略僅僅就是建立、初始化、應用,因為它沒有任何名字因此你沒法重用它。