JZ-046-圓圈中最後剩下的數

雄獅虎豹發表於2022-01-10

圓圈中最後剩下的數

題目描述

每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準備了一些小遊戲。

  • 其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他隨機指定一個數m,讓編號為0的小朋友開始報數。
  • 每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,
  • 從他的下一個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最後一個小朋友,可以不用表演,並且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!^_^)。
  • 請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
  • 如果沒有小朋友,請返回-1

題目連結: 圓圈中最後剩下的數

程式碼

/**
 * 標題:圓圈中最後剩下的數
 * 題目描述
 * 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。HF作為牛客的資深元老,自然也準備了一些小遊戲。
 * 其中,有個遊戲是這樣的:首先,讓小朋友們圍成一個大圈。然後,他隨機指定一個數m,讓編號為0的小朋友開始報數。
 * 每次喊到m-1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮物,並且不再回到圈中,
 * 從他的下一個小朋友開始,繼續0...m-1報數....這樣下去....直到剩下最後一個小朋友,可以不用表演,並且拿到牛客名貴的“名偵探柯南”典藏版(名額有限哦!!^_^)。
 * 請你試著想下,哪個小朋友會得到這份禮品呢?(注:小朋友的編號是從0到n-1)
 * <p>
 * 如果沒有小朋友,請返回-1
 * 題目連結:
 * https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6?tpId=13&&tqId=11199&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
 */
public class Jz46 {

    /**
     * 約瑟夫環,圓圈長度為 n 的解可以看成長度為 n-1 的解再加上報數的長度 m。因為是圓圈,所以最後需要對 n 取餘。
     *
     * @param n
     * @param m
     * @return
     */
    public int lastRemaining_Solution(int n, int m) {
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return 0;
        }
        return (lastRemaining_Solution(n - 1, m) + m) % n;
    }

    public static void main(String[] args) {
        Jz46 jz46 = new Jz46();
        System.out.println(jz46.lastRemaining_Solution(4, 6));
    }
}
【每日寄語】 生活總有不期而遇的溫暖和生生不息的希望,無論什麼時候都要眼看前方,滿懷希望就會所向披靡。

相關文章