十五個猴子圍成一圈選大王,依次1-7 循環報數,報到7 的猴子被淘汰,直到最後一隻猴子成爲大王。問,哪隻猴子最後能成爲大王。
需求:
選出一個大王。
思路:
將15只猴子封裝爲數組,用1–15表示。因爲需求是要求出一個大王,也就是說這個數組到最後只能存在一個元素,那麼就要定義循環。讓15只猴子輪流自1–7循環報數,而報數爲7的元素則要被刪除。顯然1次循環不可能達到需求,那麼就要定義一個內層循環完成報數和刪除操作,直到該數組只存在一個元素爲止。
這裏需要注意一點,報數時並非是循環結束了報數也要重新開始,而是當一個元素報數爲7時,其餘元素再重新開始報數。即使已經進入另一次循環,也要接續上個元素報的數。
步驟:
1、定義int數組arr,長度爲15,元素值爲1–15即代表了15只猴子的編號。
2、定義計數器counter 值爲0,用於報數,只要counter=7,就對該元素操作,並計數器歸0。
3、定義while循環,循環表達式爲:arr.length!=1,因爲只能有一個大王。
4、定義計數器a,值爲0,用於記錄每次循環時,對arr操作了幾次,也就是說用於記錄每一次循環有多少元素報數爲7。
5、定義for循環,循環表達式爲I"<"arr.length;只要一進入循環counter++。
6、定義if語句判斷counter是否爲7,是則arr[i]=0,計數器=0,a++。
7、for循環結束後新建一個數組newarr,長度爲arr.length-a。它是用於將arr的無效下標刪除。(0爲無效下標)。
8、定義計數器index,值爲0。它是用於newarr的下標。
9、定義for循環用於遍歷數組。,循環表達式爲i“<”arr.length。
10、使用if語句判斷arr[i]!=0,是則newarr[index++] = arr[i]。
11、for循環結束後,a=newa。
public class Test
{
public static void main(String[]args)
{
//功能:定義數組並向每個下標賦值
int[] arr = new int[15];
for(int i=0; i<arr.length; i++)
{
arr[i] = i;
}
//調用example方法,並由arr接收返回值
int[] arr = example(arr);
//打印arr[0]的原因:因爲arr數組接收example的返回值後arr的長度爲1。
System.out.println("大王是編號爲:"+arr[0]+” 的猴子“)
}
public static int[] example(int[] arr)
{
int counter = 0;
while(arr.length!=1)
{
int a = 0;//用於記錄每一次循環時對arr操作的次數
//功能:將報數爲7的元素變成無效元素
for(int i=0; i<arr.length; i++)
{
counter++;
if(counter==7)
{
System.out.println("Test: 即將刪除"+arr[i]);
arr[i] = 0;
counter = 0;
a++;
}
}
//功能:將arr中存儲無效元素的下標刪除
int[] newarr = new int[arr.length-a];
int index = 0;
for(int i=0; i<arr.length; i++)
{
if(arr[i]!=0)
{
newarr[index++] = arr[i];
}
}
arr = newarr;
}
renturn arr;
}
}