java _迴圈練習和陣列練習
練習
1.輸出所有的水仙花數,所謂水仙花數是指一個數3位數,其每位數字立方和等於其本身,如153 = 1*1*1 + 3*3*3 + 5*5*5(很經典的題目)
分析:
通過觀察發現,本題目要實現列印符合要求的數字(即水仙花數)。
- 明確什麼樣的數就是水仙花數。水仙花數是指一個3位數(100-999之間),其每位數字立方之和等於該3位數本身。如153 = 1*1*1 + 3*3*3 + 5*5*5,
即 3位數本身 = 百位數立方 + 十位數立方 + 個位數立方;
- 獲取水仙花範圍內的所有3位數(100-999之間的每個3位數)
- 判斷該3位數是否滿足水仙花數,滿足,列印該3位數
解題步驟:
- 使用for迴圈,得到100-999之間的每個3位數
- 獲取3位數中百位數字、十位數字、個位數字
- 使用if條件語句,判斷該3位數是否滿足水仙花數,滿足,使用輸出語句,列印該3位數
ublic class Test02 { public static void main(String[] args) { for (int i = 100; i < 1000; i++) { int bai = i/100%10; int shi = i/10%10; int ge = i%10;View Codeif (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) { System.out.println(i); } } } }
在介紹這個題前,我們先學習ASCII碼錶吧
American Standard Code for Information Interchange,美國標準資訊交換程式碼.
在計算機中,所有的資料在儲存和運算時都要使用二進位制數表示, a、b、c、d這樣的52個字母(包括大寫)、以及0、1等數字還有一些常用的符號, 在計算機中儲存時也要使用二進位制數來表示,而具體用哪些二進位制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通訊而不造成混亂,那麼大家就必須使用相同的編碼規則,於是美國有關的標準化組織就出臺了ASCII編碼,統一規定了上述常用符號用哪些二進位制數來表示。
數字0-9對應ASCII編碼十進位制為48-57, 字母a-z對應ASCII編碼十進位制為97-122,字母A-Z對應ASCII編碼十進位制為65-90,記住!!!
2.利用for迴圈列印ABCDEFG...XYZ,26個大寫字母與26個小寫字母:
public class Test04 { public static void main(String[] args) { char da = 'A'; char xiao = 'a'; for (int i = 0; i < 26; i++) { System.out.println("大寫字母 "+da+" ,小寫字母 "+xiao); da++; //更新大寫字母值 xiao++; //更新小寫字母值 } } }View Code
3. 利用for迴圈列印 9*9 表?
for (int j = 1; j < 10; j++) { for (int k = 1; k <= j; k++) { System.out.print(k +"*"+ j +"="+ j*k +"\t"); } System.out.println(); } } }View Code
4.編寫程式求 1+3+5+7+……+99 的和值
public class Test01 { public static void main(String[] args) { int sum = 0; for (int i = 0; i < 100; i++) { if (i%2==1) { sum += i; } } System.out.println("累加和的值 " + sum); } }View Code
我們可以先預習一下陣列(點)
一維陣列:
1.根據鍵盤錄入索引,查詢對應星期幾:
View Code2.陣列元素查詢(查詢指定元素第一次在陣列中出現的索引)
View Code3.陣列獲取最值(獲取陣列中的最大值最小值)
class Demo3_Array { public static void main(String[] args) { int[] arr = {33,77,22,44,55}; int max = getMax(arr); System.out.println(max); } /* 獲取陣列中最大值 1,返回值型別int 2,引數列表int[] arr */ public static int getMax(int[] arr) { int max = arr[0]; for (int i = 1;i < arr.length ;i++ ) { //從陣列的第二個元素開始遍歷 if (max < arr[i]) { //如果max記錄的值小於的陣列中的元素 max = arr[i]; //max記錄住較大的 } } return max; } }View Code
4.定義列印陣列元素方法,按照給定的格式列印[11, 33, 44, 22, 55]
public static void printArray(int[] arr) { System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { System.out.println(arr[i]+"]"); } else { System.out.print(arr[i]+", "); } } }View Code
5.實現原陣列元素倒序存放操作
//陣列元素逆序 public static void receive(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; } }View Code
6.陣列元素的選擇排序:
題目分析:
通過觀察發現,本題目要實現把陣列元素{13,46,22,65,3}進行排序
- 提到陣列排序,就要進行元素值大小的比較,通過上圖發現,我們想完成排序要經過若干次的比較才能夠完成。
- 上圖中用每圈要比較的第一個元素與該元素後面的陣列元素依次比較到陣列的最後一個元素,把小的值放在第一個陣列元素中,陣列迴圈一圈後,則把最小元素值互換到了第一個元素中。
- 陣列再迴圈一圈後,把第二小的元素值互換到了第二個元素中。按照這種方式,陣列迴圈多圈以後,就完成了陣列元素的排序。這種排序方式我們稱為選擇排序。
解題步驟:
- 使用for迴圈(外層迴圈),指定陣列要迴圈的圈數(通過圖解可知,陣列迴圈的圈數為陣列長度 - 1)
- 在每一圈中,通過for迴圈(內層迴圈)完成陣列要比較的第一個元素與該元素後面的陣列元素依次比較到陣列的最後一個元素,把小的值放在第一個陣列元素中
- 在每一圈中,要參與比較的第一個元素由第幾圈迴圈來決定。如上圖所示
a) 進行第一圈元素比較時,要比較的第一個元素為陣列第一個元素,即索引為0的元素
b) 進行第二圈元素比較時,要比較的第一個元素為陣列第二個元素,即索引為1的元素
c) 依次類推,得出結論:進行第n圈元素比較時,要比較的第一個元素為陣列第n個元素,即陣列索引為n-1的元素
public static void selectSort(int[] arr) { //功能 //外層迴圈用來控制陣列迴圈的圈數 for (int i = 0; i < arr.length-1; i++) { //內層迴圈用來完成元素值比較,把小的元素值互換到要比較的第一個元素中 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; } } } }View Code
7.陣列氣泡排序:
圖解:陣列元素{13,46,22,65,3}
題目分析:
通過觀察發現,本題目要實現把陣列元素{13,46,22,65,3}進行排序
- 提到陣列排序,就要進行元素值大小的比較,通過上圖發現,我們想完成排序要經過若干次的比較才能夠完成。
- 上圖中相鄰的元素值依次比較,把大的值放後面的元素中,陣列迴圈一圈後,則把最大元素值互換到了最後一個元素中。陣列再迴圈一圈後,把第二大的元素值互換到了倒數第二個元素中。按照這種方式,陣列迴圈多圈以後,就完成了陣列元素的排序。這種排序方式我們稱為氣泡排序。
解題步驟:
- 使用for迴圈(外層迴圈),指定陣列要迴圈的圈數(通過圖解可知,陣列迴圈的圈數為陣列長度 - 1)
- 在每一圈中,通過for迴圈(內層迴圈)完成相鄰的元素值依次比較,把大的值放後面的元素中
- 每圈內層迴圈的次數,由第幾圈迴圈來決定。如上圖所示
a) 進行第一圈元素比較時,內層迴圈次數為陣列長度 - 1
b) 進行第二圈元素比較時,內層迴圈次數為陣列長度 - 2
c) 依次類推,得出結論:進行第n圈元素比較時,內層迴圈次數為陣列長度 - n
//氣泡排序 public static void bubbleSort(int[] arr) { //功能 //外層迴圈用來控制陣列迴圈的圈數 for (int i = 0; i < arr.length-1; i++) { //j < arr.length-1 為了避免角標越界 //j < arr.length-1-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; } } } }View Code
8.陣列元素二分查詢:
圖解:
//二分查詢法(折半查詢法) public static int halfSearch(int[] arr, int number) { //定義3個變數,用來記錄min, min, mid的位置 int min = 0; int max = arr.length-1; int mid = 0; while (min <= max) { mid = (min+max)/2; //沒找了, 更新範圍,繼續比較 //更新範圍 if (arr[mid] > number) { //在左邊 max = mid-1; } else if(arr[i] < number){ //在右邊 min = mid+1; } else{ return mid ; } return -1; }View Code
二維陣列:
1.二維陣列遍歷
class Test1_Array { public static void main(String[] args) { 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++ ) { //獲取每個一維陣列中的元素 System.out.print(arr[i][j] + " "); } System.out.println(); } } }View Code
2.需求:公司年銷售額求和, 某公司按照季度和月份統計的資料如下:單位(萬元)
第一季度:22,66,44
第二季度:77,33,88
第三季度:25,45,65
第四季度:11,66,99
class Test2_Array { public static void main(String[] args) { int[][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}}; int sum = 0; //定義變數,記錄每次相加的結果 for (int i = 0;i < arr.length ;i++ ) { //獲取每一個一維陣列 for (int j = 0;j < arr[i].length ;j++ ) { //獲取每一個一維陣列中的元素 sum = sum + arr[i][j]; //累加 } } System.out.println(sum); } }View Code
---------------------------------------------------------------------------------------------------------------------------------------------------
補充
基本資料型別的值傳遞,不改變原值,因為呼叫後就會彈棧,區域性變數隨之消失
引用資料型別的值傳遞,改變原值,因為即使方法彈棧,但是堆記憶體陣列物件還在,可以通過地址繼續訪問
我們可以通過下面程式碼瞭解:
class Test3_Array { public static void main(String[] args) { /*int a = 10; int b = 20; System.out.println("a:"+a+",b:"+b); //a = 10,b = 20 change(a,b); System.out.println("a:"+a+",b:"+b); //?*/ int[] arr = {1,2,3,4,5}; change(arr); System.out.println(arr[1]); } public static void change(int a,int b) { //a = 10, b= 20 System.out.println("a:"+a+",b:"+b); //a = 10,b = 20 a = b; //a = 20 b = a + b; //b = 40 System.out.println("a:"+a+",b:"+b); //a = 20, b = 40 } public static void change(int[] arr) { //1,4,3,8,5 for(int x=0; x<arr.length; x++) { if(arr[x]%2==0) { arr[x]*=2; } } } }View Code
可以如下圖解
基本資料型別的值傳遞:
引用資料型別的值傳遞
Java中到底是傳值還是傳址?
1,既是傳值,也是傳地址,基本資料型別傳遞的值,引用資料型別傳遞的地址
2,java中只有傳值,因為地址值也是值(出去面試都說這種,支持者是高司令(java之父))