java數組練習2

/*

  • 數據結構簡析
  • 1數據與數據的邏輯關係分類:
  • 1.1集合
  • 1.2一對一關係(數組,鏈表)
  • 1.3,一對多(二叉樹,三叉樹)
  • 1.4,多對多(人際關係圖)
  • 2二數據的儲存結構
  • 2.1一對一: 線性表,分爲順序表(例如數組),棧(先進後出),隊列(先進先出)),鏈表
  • 2.2一對多:樹形結構,二叉樹,三叉樹,b+樹等
  • 2.3多對多:圖形結構,分有向圖與無向圖
  • 基本算法
  • 1,排序算法
  • 2,檢索算法
  • 數組的常見算法
  • 1,數組元素的賦值(楊輝三角,回型數組)
  • 2,求數值型數組元素的極值,平均數,總和等
  • 3,數組的複製,反轉,查找(線性查找,二分法查找)
  • 4,數組元素的排序算法
    */
package com.atguigu.contact;
import java.util.*;
public class Array3 {
     public static void main(String[] args) {
    	 Scanner scan = new Scanner(System.in);
    	 //練習1,求二維數組所有元素的和
    	 int[][] array = new int[][] {{3,-5,6},{2,8},{9,-2,5,7}};
    	 int sum = 0;
    	 for (int i = 0; i < array.length; i++) {
			for (int j = 0; j < array[i].length; j++) {
				sum +=  array[i][j];
			}
		}
    	 System.out.println("二維數組的所有元素和是" + sum);
    	 
    	 /*練習2,
    	  * int[] x,y [];//此時表示聲明x爲一維數組,y爲二維數組
    	  * 因爲 int[] a,b = int[] a 與 int[] b ,也就是 int[] x, int[] y[]
    	  * 在給x與y賦值後,以下選項可以編譯通過的是
    	  * 1,x[0] = y; // no
    	  * 2,y[0] = x; // yes
    	  * 3,y[0][0] = x;// no
    	  * 4,x[0][0] = y,// no
    	  * 5,y[0][0] = x[0];// yes
    	  * 6,x = y//no
    	  * 數組賦值需要滿足相同類型或者可以自動類型提升
    	  */
    	 
    	 //練習三,使用二維數組打印一個指定行數楊輝三角
		/*
		 * 1,第一行一個元素,第n行n個元素 
		 * 2,每一行的第一個和最後一個是1 
		 * 3,從第三行開始,對於非第一個元素和最後一個元素有
		 * yanghui[i][j]=yanghui[i-1][j-1] + yanghui[i-1][j]
		 */
    	 //思路,對二維數組聲明賦值後打印
    	 
    	 //輸入行數
    	 System.out.println("請輸入要打印的楊輝三角行數");
    	 int line = scan.nextInt();
    	 int[][] array1 = new int[line][];//動態聲明二維數組行數
    	 //聲明賦值二維數組
    	 for (int i = 0; i < array1.length; i++) {
			array1[i] = new int[i+1];//聲明每行列數
			array1[i][0] = 1;//每行第一個元素是1
			array1[i][i] = 1;//每行最後一個元素是1
			//可以寫成連續賦值的形式array1[i][0] = array[i][i] = 1;
			//
			for (int j = 0; j < array1[i].length; j++) {
				if(j > 0 && j < i) {
					array1[i][j]=array1[i-1][j-1] + array1[i-1][j];//每行其他元素滿足楊輝三角要求
				}
			}
			/*第二種寫法,if在外層
			 * if(i > 1){
			 *   for(j = 1;j < array[i].length - 1;j++){
			 *   array1[i][j]=array1[i-1][j-1] + array1[i-1][j];
			 *   }
			 * }
			 */
		 }
        //遍歷輸出楊輝三角
    	 for (int i = 0; i < array1.length; i++) {
			for (int j = 0; j < array1[i].length; j++) {

				System.out.print(array1[i][j] + " ");
			}
			System.out.println();
		}
    	 
    	 //創建一個長度爲15的int型一維數組,要求數組的元素值在1-30之間,隨機賦值,要求各個元素不同
    	 //方式一,有重複值則通過i--進行當前循環
    	 int[] array2 = new int[15];//創建動態數組,長度15
    	 for (int i = 0; i < array2.length; i++) {
    		 array2[i] = (int)(Math.random() * 30 + 1);//元素賦值,將隨機數範圍[0,1)擴展至[0,31),隨機數爲浮點型,需要強轉爲int型
    		 for (int j = 0; j < i; j++) {
    		 if(array2[i] == array2[j]) {//判斷是否重複
    	     i--;//如果重複則重新開始本次循環
    	     break; //如果重複結束當前循環    
    		 }
    	   }
		}
    	for (int i = 0; i < array2.length; i++) {
    		System.out.print(array2[i] + " ");//輸出所有數組元素
		}
    	System.out.println("\n");
    	//方式二,使用布爾型變量判斷
    	int[] array3 = new int[10];
   	 for (int i = 0; i < array3.length; i++) {
   		 array3[i] = (int)(Math.random() * 30 + 1);
   		boolean mark = false;//賦值mark爲假
   		for(;;) {
   			for (int j = 0; j < i; j++) {
				if(array3[i] == array3[j]) {
					mark = true;
					break;//如果有重複元素則mark賦值爲真,且停止內層循環
				}
			}  		
   	        if(mark){//如果mark爲真則重新賦值
   	        	array3[i] = (int)(Math.random() * 30 + 1);
   	        	mark = false;//重置mark標記,爲下一次比較準備
   	        	continue;//結束當前次循環,進入下一輪判斷       	
   	        }	
   	        break;//當mark爲false時,爲無限循環加上中斷語句
   	     }
   	 }
		
   	for (int i = 0; i < array3.length; i++) {
   		System.out.print(array3[i] + " ");
		}//輸出所有數組元素
   	    System.out.println("\n");
   	    
   	    //打印回形數組
   	    //方法一
   	    System.out.println("請輸入回形數組陣的大小");
   	    int length = scan.nextInt();
   	    int[][] array4 = new int[length][length];
   	    int s = length *length;//s爲二維數組元素的總數
   	    int i,j;
   	    i = j = 0;
   	    int k =1;//K=1向右,K=2向下,K=3向左,K=4向上,設定4種情況
   	    for(int m = 1;m <= s;m++) {//遍歷數組元素,依次按照設定角標順序賦值
   	    	if(k == 1) {
   	    		if(j < length && array4[i][j] == 0) {
   	    			array4[i][j++] = m;//第一行1234----length向右賦值
   	    		}else {
   	    			k = 2;//賦值完後轉到最後一列向下賦值
   	    			i++;
   	    			j--;
   	    			m--;
   	    		}
   	    	}else if(k == 2) {
   	    		if(i < length && array4[i][j] == 0) {
   	    			array4[i++][j] = m;//最後一列向下賦值
   	    		}else {
   	    			k = 3;//賦值完後轉到最後一行向左賦值
   	    			i--;
   	    			j--;
   	    			m--;
   	    		}
   	    		
   	    	}else if(k == 3) {
   	    		if(j >= 0 && array4[i][j] == 0) {
   	    			array4[i][j--] = m;//最後一行向左賦值
   	    		}else {
   	    			k = 4;//賦值完後轉到第一列向上賦值
   	    			i--;
   	    			j++;
   	    			m--;
   	    		}
   	    	}else if(k == 4) {
   	    		if(i >= 0 && array4[i][j] == 0) {
   	    			array4[i--][j] = m;//第一列向上賦值
   	    		}else {
   	    			k = 1;//賦值完後轉到第二行向右賦值,開始新的循環,直到所有數組元素都不等於初始值0 ,數組賦值完成
	    			i++;
	    			j++;
	    			m--;
   	    	    }
   	    	    }
   	    }
   	    for (int n = 0; n < array4.length; n++) {
   	    	for (int l = 0; l < array4[n].length; l++) {
   	    		System.out.print(array4[n][l] + " ");
			}   
   	        System.out.println();
		}
   	       
   	    //方法二
   	    System.out.println("請輸入回形數組陣的大小");
	    int length2 = scan.nextInt();
	    int[][] array5 = new int[length2][length2];
	    int count = 0;//要輸入的數據
	    int maxX = length2 - 1;//二維數組x軸的最大下標
	    int maxY = length2 - 1;//二維數組y軸的最大下標
	    int minX = 0;////二維數組x軸的最小下標
	    int minY = 0;//二維數組y軸的最小下標
	    while(minX <= maxX) {
	         for (int x = minX; x <= maxX; x++) {
				array5[minY][x] = ++count;
			 }
	    	 minY++;
	    	 for (int y = minY; y <= maxY; y++) {
					array5[y][maxX] = ++count;
				 }
		     maxX--;
		     for (int x = maxX; x >= minX; x--) {
					array5[maxY][x] = ++count;
				 }
		     maxY--;
		     for (int y = maxY; y >= minY; y--) {
					array5[y][minX] = ++count;
				 }
			 minX++;	
	    }
	       
	    for (int n1 = 0; n1 < array5.length; n1++) {
   	    	for (int l1 = 0; l1 < array5[n1].length; l1++) {
   	    		System.out.print(array5[n1][l1] + " ");
			}   
   	        System.out.println();
		}
 	 
	    //定義一個int型一維數組,包含n個元素,分別賦值隨機整數
	    //求出所有元素的最大值,最小值,總和,平均值,並輸出
	    System.out.println("請輸入隨機數組的長度");
	    int length3 = scan.nextInt();
	    int[] array6 = new int[length3];
	    for (int l = 0; l < array6.length; l++) {
			array6[l] = (int)(Math.random() * 99 + 1);//元素範圍1-99
		}
	    int maxValue = array6[0];
	    int minValue = array6[0];	    
	    int sumValue = array6[0];
	    for (int l = 0; l < array6.length; l++) {
			if(maxValue <= array6[l]) {
				maxValue = array6[l];
			}
			if(minValue >= array6[l]) {
			   minValue = array6[l];
			}
			sumValue += array6[l];
		}
	    System.out.println("隨機數組爲");
	    for (int l = 0; l < array6.length; l++) {
	    	System.out.print(array6[l] + " ");
		}
	    System.out.println();
	    System.out.println("最大值爲" + maxValue);
	    System.out.println("最小值爲" + minValue);
	    System.out.println("總和爲" + sumValue);
	    double averageValue = sumValue / length3;
	    System.out.println("平均值爲" + averageValue);
	    
	    //數組的複製
	    int[] array7,array8;
	    array7 = new int[] {2,3,5,7,11,13,17,19,23,29};
	    //查看array7中元素
	    for (int l = 0; l < array7.length; l++) {
	    	System.out.print(array7[l] + " ");
		}
	    System.out.println();
	    
	    array8 = array7;//把array7首地址值賦值給array8,此時堆空間中實際只有一個數組。
	    //數組複製不能用上面的方式。
	    //
	    int[] array9 = new int[array7.length];
	    for (int l = 0;l < array9.length;l++) {
			array9[l] = array7[l];
		}
	    //查看array8中元素
	    for (int l = 0; l < array8.length; l++) {
	    	System.out.print(array8[l] + " ");
		}
	    System.out.println();
	    //修改並輸出array8中元素
	    for (int l = 0; l < array8.length; l++) {
	    	if(l % 2 == 0 ){
	    		array8[l] = l;
	    	}
	    	System.out.print(array8[l] + " ");
		}
	    System.out.println();
	    //查看array7中元素
	    for (int l = 0; l < array7.length; l++) {
	    	System.out.print(array7[l] + " ");
		}
	    System.out.println();//修改array8後,array7元素也會被改變
	    //查看array9元素	   
	    for (int l = 0;l < array9.length;l++) {
	    	System.out.print(array9[l] + " ");	    	
		}//與原array7數據相同
	    System.out.println();
	    
	    //數組的反轉,通過臨時變量遍歷交換賦值
	    //
	    String[] array10 = new String[] {"AA","BB","CC","DD","EE","FF","GG"};
	    for (int l = 0;l < array10.length;l++) {
	    	System.out.print(array10[l] + " ");	    	
		}
	    System.out.println();
	    //方法一
	    String temp ="";//創建臨時變量temp,可以放在for循環內
	    for (int l = 0; l < array10.length/2; l++) {
			temp = array10[l];
			array10[l] = array10[array10.length - l - 1];
			array10[array10.length - l - 1] = temp;
		}
	    for (int l = 0;l < array10.length;l++) {
	    	System.out.print(array10[l] + " ");	    	
		}
	    System.out.println();
	    
	    //方法二
	    for (int l = 0, p = array10.length - 1; l < p; l++,p--) {
			String temp1 = array10[l];
			array10[l] = array10[p];
			array10[p] = temp1;
		}
	    
	    for (int l = 0;l < array10.length;l++) {
	    	System.out.print(array10[l] + " ");	    	
		}
	    System.out.println();
	    
	    
	    //數組元素的 查找(基本方式線性查找,較常用的二分法查找)
	    System.out.println("請輸入要查找的元素");
	    boolean mark1 = true;
	    String ask = scan.next();
	    for (int l = 0;l < array10.length;l++) {	
	            if(ask.equals(array10[l])){
				System.out.println(ask +"在數組角標爲" + l + "的位置");
				mark1 = false;
				break;
			}
		}
	    if(mark1) {
	    	System.out.println("數組中不存在元素" + ask);
	    }
	    
	    //二分法查找,較線性查找快
	    //每次從數組中間開始查找一半,左半邊沒有查找右半邊,右半邊再從中間開始找
	    //二分法使用的前提是所要查找的數組有序
	    System.out.println("請輸入隨機數組的長度");
	    int length4 = scan.nextInt();
	    int[] array11 = new int[length4];
	    for (int l = 0; l < array11.length; l++) {
	    	array11[l] = (int)(Math.random() * 201 - 100);//隨機數組範圍【-100,100】		    
	    }	    
	    //先排序,將數組變爲有序數組
	    for (int l = 0; l < array11.length - 1; l++) {
			for (int l2 = 0; l2 < array11.length - 1 -l; l2++) {
				if(array11[l2] > array11[l2 + 1]) {
					int temp1 = array11[l2];
					array11[l2] = array11[l2 + 1];
					array11[l2 + 1] = temp1;
				}
			}
		}
	    for (int l = 0;l < array11.length;l++) {
	    	System.out.print(array11[l] + " ");	    	
		}
	    System.out.println();
	    System.out.println("請輸入要查找的數字,範圍-100到100");
	    boolean mark2 = true;
	    int ask1 = scan.nextInt();
	    int start = 0;
	    int end = array11.length - 1;
	    for(;start <= end;) {//或者使用while(start <= end)
	    	int middle = (start + end) / 2;
	    	if(array11[middle] == ask1) {
	     	System.out.println(ask1 + "在隨機數組中的角標是" + middle);
	    	mark2 = false;
	    	break;	
	    	}else if(ask1 < array11[middle]) {
	    	end = middle - 1;//通過改變頭尾賦值來不斷縮小範圍,最終收斂到start=end結束循環
	    	}else if(ask1 > array11[middle]) {
	    	start = middle + 1;	
	    	}	    	
	    }	    
	    if(mark2) {
	    	System.out.println("數組中不存在元素" + ask1);
	    }
		System.out.println("OVER");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章