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)、使用匿名陣列的策略僅僅就是建立、初始化、應用,因為它沒有任何名字因此你沒法重用它。