解決數三退一問題(陣列,物件導向)

2021-09-24 17:11:18 字數 3215 閱讀 9168

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個人圍成乙個圈 陣...