首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 約瑟夫環死循環修正:break 條件前移

     編輯:程式設計綜合問答

原始碼邏輯

while (true) {
    Object out = l1.get(n - 1);
    l2.add(out);
    l1.remove(out);
    n--; n += 3;
    while (n - 1 >= l1.size()) n -= l1.size();
    if (l1.size() == 0) break; // <-- 位置太靠後
}

死循環原因

當移除最後一個元素後,l1.size() == 0,但代碼**仍會執行** n--; n += 3; while (n-1 >= 0) n -= 0; 導致 n 不變,下一次迴圈 l1.get(n-1) 拋 IndexOutOfBoundsException 或邏輯卡死。

修正

while (!l1.isEmpty()) {  // 直接以集合非空為迴圈條件
    Object out = l1.get(n - 1);
    l2.add(out);
    l1.remove(out);
    if (l1.isEmpty()) break; // 立即跳出,避免後續索引運算
    n = (n + 2) % l1.size(); // 合併 n--; n+=3; 取模運算更簡潔
    if (n == 0) n = l1.size(); // 取模結果 0 代表最後一個
}

關鍵改進

  • 迴圈條件改為 !l1.isEmpty(),語意清晰。
  • break 前移至 remove 後、索引運算前。
  • 索引更新用取模 (n + step - 1) % size 替代多行加減,消除邊界迴圈。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved