1. 程式人生 > >java _循環練習和數組練習

java _循環練習和數組練習

++ for循環 信息 for 冒泡排序 一個 最後一個元素 這樣的 最小值

練習

1.輸出所有的水仙花數,所謂水仙花數是指一個數3位數,其每位數字立方和等於其本身,如153 = 1*1*1 + 3*3*3 + 5*5*5(很經典的題目)

分析:

通過觀察發現,本題目要實現打印符合要求的數字(即水仙花數)。

  1. 明確什麽樣的數就是水仙花數。水仙花數是指一個3位數(100-999之間),其每位數字立方之和等於該3位數本身。如153 = 1*1*1 + 3*3*3 + 5*5*5,

即 3位數本身 = 百位數立方 + 十位數立方 + 個位數立方;

  1. 獲取水仙花範圍內的所有3位數(100-999之間的每個3位數)
  2. 判斷該3位數是否滿足水仙花數,滿足,打印該3位數

解題步驟:

  1. 使用for循環,得到100-999之間的每個3位數
  2. 獲取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;
            
            if (i == bai*bai*bai + shi*shi*shi + ge*ge*ge) {
                System.out.println(i);
            }
        }
    }
}
View Code

在介紹這個題前,我們先學習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 Code

2.數組元素查找(查找指定元素第一次在數組中出現的索引)

技術分享圖片View Code

3.數組獲取最值(獲取數組中的最大值最小值)

技術分享圖片
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}進行排序

  1. 提到數組排序,就要進行元素值大小的比較,通過上圖發現,我們想完成排序要經過若幹次的比較才能夠完成。
  2. 上圖中用每圈要比較的第一個元素與該元素後面的數組元素依次比較到數組的最後一個元素,把小的值放在第一個數組元素中,數組循環一圈後,則把最小元素值互換到了第一個元素中。
  3. 數組再循環一圈後,把第二小的元素值互換到了第二個元素中。按照這種方式,數組循環多圈以後,就完成了數組元素的排序。這種排序方式我們稱為選擇排序。

解題步驟:

  1. 使用for循環(外層循環),指定數組要循環的圈數(通過圖解可知,數組循環的圈數為數組長度 - 1)
  2. 在每一圈中,通過for循環(內層循環)完成數組要比較的第一個元素與該元素後面的數組元素依次比較到數組的最後一個元素,把小的值放在第一個數組元素中
  3. 在每一圈中,要參與比較的第一個元素由第幾圈循環來決定。如上圖所示

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}進行排序

  1. 提到數組排序,就要進行元素值大小的比較,通過上圖發現,我們想完成排序要經過若幹次的比較才能夠完成。
  2. 上圖中相鄰的元素值依次比較,把大的值放後面的元素中,數組循環一圈後,則把最大元素值互換到了最後一個元素中。數組再循環一圈後,把第二大的元素值互換到了倒數第二個元素中。按照這種方式,數組循環多圈以後,就完成了數組元素的排序。這種排序方式我們稱為冒泡排序。

解題步驟:

  1. 使用for循環(外層循環),指定數組要循環的圈數(通過圖解可知,數組循環的圈數為數組長度 - 1)
  2. 在每一圈中,通過for循環(內層循環)完成相鄰的元素值依次比較,把大的值放後面的元素中
  3. 每圈內層循環的次數,由第幾圈循環來決定。如上圖所示

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之父))

java _循環練習和數組練習