500個小孩手拉手圍成乙個圈,第乙個小孩從0開始數,數到3,就淘汰出局,退出這個圈,直至剩餘最後乙個,輸出該小孩。
建立小孩陣列,並將每個小孩賦布林初值為 true 表示在圈內;
預設從陣列下標為0開始數,用count 計數(初值為1);
當count == 3 淘汰這個小孩,即將其值設為false,並將計數器count置為初值1;
迴圈完所有陣列元素後,將元素為true的元素下標列印出來;
package com.fjh.test;
public
class
count3quit1
// 開始報數
int count =1;
// 計數器
int index = children.length;
// 剩餘人數
int flag =0;
// 當前下標
while
(index >1)
} flag++
;//輪完一圈開始新的一圈
if(flag == children.length)
}// 輸出剩餘這個孩子
for(
int i =
0; i < children.length; i++)}
}}
person類屬性成員
id ; //id
person left;//左邊成員
person right;//右邊成員
circle類分析
1. 屬性成員
圈子物件 cicle
圈子大小 count = 0
圈子的第乙個人person first
圈子的最後乙個人person last
2. 方法抽象
new cicle(500)//圈子要初始化
3. 方法 加人(person p)
圈子中已經有人的情況
count ++
原來圈子中最後乙個人的右邊 》 新加人p
新加人p的左邊 》 原來圈子中的最後乙個人
新加人p的右邊 》 原來圈子中第乙個人
原來圈子中最後乙個人 = 新加人p
原來圈子中第乙個人的左邊新加人p的右邊
如果是乙個空圈 count= 0
圈子中的第乙個人 = 新加人p
圈子中最後乙個人 = 新加人p
方法 刪除人(person p)
刪除人p左邊的人 》 刪除人右邊的人
刪除人右邊的人 》 刪除人左邊的人
如果刪除的是第乙個人
刪除人的右邊的人變成了圈子中的第乙個人
如果刪除人是最後乙個人
刪除人的左邊變成了圈子中的最後乙個人
person類
package com.fjh.entity;
public
class
person
public
void
setid
(int id)
public person getleft()
public
void
setleft
(person left)
public person getright()
public
void
setright
(person right)
public
person
(int id)
public
person()
}
circle類
package com.fjh.entity;
public
class
circle
public
void
setcount
(int count)
public person getfirst()
public
void
setfirst
(person first)
public person getlast()
public
void
setlast
(person last)
/** * 新增
* @param p 要加入圈子的人
*/public
void
addperson
(person p)
else
this
.count++
;//圈內人數加1
}/**
* 移除
* @param p 將要移除的人
*/public
void
removeperson
(person p)
if(p ==
this
.last)
this
.count--
;//減掉圈內人數
}/**
* 數三取一
*/public
void
c3q(
) p = p.
getright()
;//「指標」右移}}
/** * 構造方法初始化圈的大小
* * @param count
* 圈的大小
*/public
circle
(int count)
}}
測試類
package com.fjh.test;
import com.fjh.entity.circle;
public
class
count3quittest
}
結果 JAVA 數三退一問題的解決
數三退一 500個小孩手拉手圍成一圈,從第乙個小孩開始數數,按照1 2 3 1 2 3迴圈不斷的數,數到3的小孩退出圈,其他小孩接著數,直到剩下乙個小孩,問這個小孩的排在什麼位置?思路分析 可以定義乙個布林型的陣列,用來存放500個小孩,若為true,代表在圈內,若為false,則代表出圈。首先,每...
繼續磕演算法呵呵。數三退一問題。
邏輯倒是夠清晰,不過直覺告訴我方法肯定能改進。初始化陣列。boolean list new boolean 500 for int i 0 i list.length i count用來數三,limit用來在陣列裡只有乙個true的時候結束迴圈。int count 0 int limit 0 如果上...
數三退一問題 拉手成圈出圈問題
一,問題描述 500個人圍成一圈 從第乙個人開始數數,第乙個人數1 第二個人數2 第三個人數3 數到3的人退出圈子,第四個人重新開始數數 第四個數1 第五個2 第六個 3 退出圈子 一直這樣數下去,求最後剩餘的那個人所在位置。二,問題詳細求解思路 1.面向過程的思想 陣列表示500個人圍成乙個圈 陣...