演算法心得:
1、花費了一晚上和一上午
2、要把整個過程分析透徹。
3、要把整個過程模擬的很清楚,就像把發生的過程中每一步,都要描述一遍,當然描述是用程式來說的。是用迴圈來做的。
演算法過程:
需要引數:
1 i,做為陣列下標
2、j,做為數到3的記數
3、quitnum,做為退出人的記數
邏輯情況:
1、當退出的時候,陣列元素如何處理(讓其等於0)
2、當 i 算到最後時,如果能返回i- 0重新計算(i = i - group.length),這樣就算i超出了乙個,仍然算到了i - 1頭上。
3、每當 j 要加的時候,當j = 3後,j的後乙個和後二個肯定不會退出。所以在j =3後,j後兩個元素可以忽略。
4、如果 出現3的情況,一定要判斷 j 後邊的元素是否退出,也即group[i]是否為0,所以需要在每一次j++的前面,都要判斷,如果後面的已經退出,則使用continue關鍵字。不用j++了。但是i還是要加。
5、相應的,i++後面,group前面,一定要判斷,是否超出邊界了,如果超出,則i = i - group.length.
6、在任何時候,一但出現有人退出的情況,要讓quitnum++,一但quitnum判斷,還剩下乙個人(
if (quitnum == group.length - 1)
)
那邊就啥也不做了,趕緊break,退出迴圈,並在下邊 的處理中,把最後的這個人的 i 記錄並return出去。
思路歷程:
剛開始反反覆覆在修改,但是慢慢就確定了引數和邏輯。
程式真的是一步步先有個大概,然後不斷的去摸索事實,用程式去最大限度的模擬事實,才算出來的。
package chapter5;
public class count3quit
system.out.println();
system.out.println("count 3 then quit...");
system.out.println("the one who is be left finally is:");
system.out.println(count3quit(group500));
} public static int generatearray()
return group500;
} public static int count3quit(int group)
// system.out.println(group.length);
if (group[i] == 0)
if (j == 3)
j = 1;
i++;
}if (i >= group.length)
// system.out.println(group.length);
if (group[i] == 0)
j++;
} int leftnum = -1;// 最後留下來的號
for (int i = 0; i < group.length; i++)
} return leftnum;
}}
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 如果上...
機器學習(一)k 進鄰演算法
概述 原理 存在乙個樣本資料集合,也稱作為訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中每乙個資料與所屬分類的對應關係。輸入沒有標籤的新資料後,將新的資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本最相似資料 最近鄰 的分類標籤。一般來說,我們只選擇樣本資料集中前k...