Java學習之陣列練習

@ 搖滾吧!阿文發表於2020-12-30

1、今天同學們相約一起爬山遊玩,為了更好的進行這場活動,大家準備推舉一個人作為出遊的臨時隊長。為了體現合理公平,大家提出了一個比較有趣的規則。所有人圍成一圈,順序排號。從第一個人開始報數(從 1 到 3 報數),凡報到 3 的人退出圈子,剩下的人繼續報數,最後留下的當選為隊長。請你通過編寫程式,求出一組人中的隊長是原來第幾位同學。

package com.day05.homework5;
import java.util.Scanner;
public class Captain {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("總共有幾位同學:");
		int num = scanner.nextInt();
		//定義一個陣列
		boolean[] student =new boolean[num];
		//陣列長度
		int numbers = student.length;
		int count=0;//儲存報數
		int index=0;//儲存索引下標
		
		//全部排號為true
		for (int i = 0; i <student.length; i++) {
			student[i]=true;
		}
		/*
		 * 開始從1報數
		 * 如果該同學報數為3,那麼報數count清為0,該學生排號為false,並退出圈子,人數numbers-1,繼續下一輪報數
		 * 如果報數到最後一位學生,從頭開始
		 */
		while (numbers>1) {
			//如果排號為true的,報數+1
			if (student[index] ==true) {
				count++;
			}	
			if (count==3) {
				count=0;
				student[index]=false;
				numbers--;
			}
			index++;
			if (index==num) {
				index=0;
			}
		}
		//迴圈遍歷找到排號沒有變為false的學生為隊長
		for(int i=0;i<student.length;i++) {
			if(student[i]==true) {
				System.out.println("隊長是第"+(i+1)+"位同學");
			}
		}
	}
}

2、查詢某個整數定義一個長度為 10 的整型陣列 nums ,迴圈輸入 10 個整數。 然後將輸入一個整數,查詢此整數,找到輸出下標, 沒找到給出提示。

package com.day05.homework5;
import java.util.Scanner;
public class Demo1 {
	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		System.out.println("請輸入10個整數:");
		int [] nums = new int[10];
		for (int i = 0; i < nums.length; ) {
			System.out.println("第"+(i+1)+"個數字:");
			if (scanner.hasNextInt()) {
				nums[i] = scanner.nextInt();
				i++;
			}else {
				System.out.println("請輸入一個整數");
			}
		}
		int index=0;//儲存下標
		System.out.println("輸入你要找的數字");
		int num2 = scanner.nextInt();
		for (int i = 0; i < nums.length; i++) {
			if (num2==nums[i]) {
				index = i;
				//System.out.println("該數字的下標為:"+index);
				break;
			}else {
				index=-1; 
			}
		}
		if (index!=-1) {
			System.out.println("該數字的下標為:"+index);
		}else {
			System.out.println("數字不存在");
		}
	}
}
 

3 、找出陣列的最值定義一個長度為 10 的整型陣列 nums ,迴圈輸入 10 個整數。輸出陣列的最大值、最小值。

package com.day05.homework5;
import java.util.Scanner;
public class Demo2 {
	public static void main(String[] args) {
		int [] nums = new int[10];
		Scanner scanner = new Scanner(System.in);
		System.out.println("請輸入10位數:");
		for (int i = 0; i < nums.length; i++) {
			System.out.println("請輸入第"+(i+1)+"個數字");
			if (scanner.hasNextInt()) {
				nums[i]=scanner.nextInt();
			}else {
				System.out.println("請輸入一個整數:");
			}	
		}
		int max=nums[0];
		int min=nums[0];
		for (int i = 1; i < nums.length; i++) {
			if (max<nums[i]) {
				max=nums[i];
			}
			if (min>nums[i]) {
				min=nums[i];
			}
		}
		System.out.println("最大值為:"+max);
		System.out.println("最小值為:"+min);
	}
}

4 、兩數之和給定一個整數陣列 nums 和一個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並輸出他們的陣列下標,假設每種輸入只會對應一個答案,不能重複利用這個陣列中同樣的元素。示例:
給定 nums = [2, 7, 11, 15], target = 9
因為 nums[0] + nums[1] = 2 + 7 = 9
所以輸出 0,1

package com.day05.homework5;
import java.util.Scanner;
public class Demo3 {
	public static void main(String[] args) {
		Scanner scanner =new Scanner(System.in);
		System.out.println("請輸入4個整數:");
		int [] nums = new int[4];
		for (int i = 0; i < nums.length;) {
			System.out.println("第"+(i+1)+"個數字:");
			if (scanner.hasNextInt()) {
				nums[i] = scanner.nextInt();
				 i++;
			}else {
				System.out.println("請輸入一個整數");
			}
		}
		System.out.println("請輸入目標值:");
		int target=0;
		if (scanner.hasNextInt()) {
			target = scanner.nextInt();
			for (int i = 0; i < nums.length; i++) {
				for (int j = i+1; j < nums.length; j++) {
					if (nums[i]+nums[j]==target) {
						System.out.println("兩個數相加等於目標值的下標分別為:");
						System.out.println(i+","+j);
						break;
					}
				}
			}
		}else {
			System.out.println("請正確輸入一個整數");
		}				
	}
}

5、排序並查詢對陣列{1,3,9,5,6,7,15,4,8}進行排序,然後使用二分查詢 輸入目標值 並輸出排序後的下標。

package com.day05.homework5;
import java.util.Scanner;
public class Demo4 {
	public static void main(String[] args) {
		int [] nums={1,3,9,5,6,7,15,4,8};
		int temp=0;
		/**
		 * 陣列排序
		 */
		//外層迴圈輪數
		for (int i = 0; i < nums.length-1; i++) {
			//每輪比較次數
			for (int j = 0; j < nums.length-i-1; j++) {
				if (nums[j]>nums[j+1]) {
					temp =nums[j];
					nums[j]=nums[j+1];
					nums[j+1]=temp;
				}
			}
		}
		//遍歷陣列
		for (int i = 0; i < nums.length; i++) {
			System.out.print(nums[i]+",");
		}
		/**
		 * 使用二分法查詢目標值
		 */
		System.out.println();
		System.out.println("請輸入你要查詢的資料:");
		Scanner scanner = new Scanner(System.in);
		//儲存輸入目標值
		int target=0;
		if (scanner.hasNextInt()) {
			target = scanner.nextInt();
		}else {
			System.out.println("請正確輸入一個整數");
		}
		int minIndex=0;//最小下標
		int maxIndex=nums.length-1;//最大下標
		int centerIndex=(maxIndex+minIndex)/2;//中間下標
		while (true) {
			if (nums[centerIndex]>target) {
				maxIndex=centerIndex-1;
			}else if (nums[centerIndex]<target) {
				minIndex=centerIndex+1;
			}else {
				break;
			}
			if (minIndex>maxIndex) {
				centerIndex=-1;
			}
			centerIndex=(maxIndex+minIndex)/2;
		}
		if (centerIndex!=-1) {
			System.out.println("值的下標為:"+centerIndex);
		}
	}
}

6、移動零給定一個陣列 nums,編寫一個函式將所有 0 移動到陣列的末尾,同時保持非零元素的相對順序。
示例:
輸入: [0,1,0,3,12] 輸出: [1,3,12,0,0]

package com.day05.homework5;
public class Demo5 {
	public static void main(String[] args) {
		int[] nums={0,34,0,3,12};
		int temp=0;
		/**
		 * 陣列排序
		 */
		//外層迴圈輪數
		for (int i = 0; i < nums.length-1; i++) {
			//每輪比較次數
			for (int j = 0; j < nums.length-i-1; j++) {
				if (nums[j]>nums[j+1]) {
					temp =nums[j];
					nums[j]=nums[j+1];
					nums[j+1]=temp;
				}
			}
		}
		//遍歷陣列
        for(int i=0;i<nums.length;i++){
            System.out.print(nums[i]+" ");
        }
        System.out.println("");
        System.out.println("移動後如下:"  );
        for(int i=0;i<nums.length;i++){
        	if (nums[i]==0) {
				int j=i+1;//非0數字的下標
				while (j<nums.length) {
					if (nums[j]!=0) {
						nums[i]=nums[j];
						nums[j]=0;
						break;
					}else {
						j++;
					}
					if (j==nums.length) {
						break;
					}
				}
			}
            System.out.print(nums[i]+" ");
        }
	}
}

相關文章