經典面試題:n個數字(0,1,…,n-1)形成一個圓圈


題目:

n個數字(0,1,…,n-1)形成一個圓圈,從數字0開始, 
每次從這個圓圈中刪除第m個數字(第一個為當前數字本身,第二個為當前數字的下一個數字)。 
當一個數字刪除后,從被刪除數字的下一個繼續刪除第m個數字。 
求出在這個圓圈中剩下的最后一個數字。 

 

我的思路:

這是個很經典的環形問題,最優的方案時間復雜度是O(n):先構建遞推公式,再使用循環或者遞歸都能輕松求解,

網上的教程很少能把這個遞推公式的由來描述清楚,所以我在這里加入我的一些理解。

由於我們要求解的是n個元素,第m個數字,要找到最后的一個數字,那么我在這里假設得到的結果是f(n,m),

假設我們已有數列為:

0    1    ...  m-2    m-1  m  ...     n-1

刪除一次后得到的新數列是(注意題目條件->從被刪除數字的下一個繼續刪除):

m    m+1   ...   n-1     0    1    ...    m-2   ①

很顯然,通過一次刪除后,問題規模從n變成了n-1,而f(n-1,m)所要求解的數列是:

0    1    ...  m-2    m-1  m  ...     n-2 ②

很顯然,把數列②向左移動m就變成了①的解(注意①和②不完全相同,但是我們想要求的是第一個值,因為第一個值是刪除后剩下的數字),

考慮到“左加右減”的數學原理和環形的特征,得到遞推公式:

               0                          if n==1  

f(n,m)={                                            

               (f(n-1,m)+m)%n    if  n>1

那么也就不難得到如下代碼:

int LastNumberOfCircle(int n, int m)
{
    int last = 0;
    for(int i=2;i<=n;++i)
    {
        last = (last+m)%i;
    }
    return last;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 面試題3:在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那么對應的輸出是第一個重復的數字2。 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 給定一個數組A[0,1,...,n-1],請構建一個數組B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。 面試題:f(n) = f(n-1) + f(n-2) 求 f(100) 面試題:給定一個長度為N的數組,其中每個元素的取值范圍都是1到N。判斷數組中是否有重復的數字 【面試題043】n個骰子的點數 求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一個數字 LeetCode–0~n-1中缺失的數字 初學者習題練習。從控制台輸入一個數n,使用for循環實現求n! 提示:n! =n*(n-1)*(n-2)*…*1 升級:求1!+2!+3!+…+n!的值 劍指Offer(Java版)第五十六題:在一個長度為n的數組里的所有數字都在0到n-1的范圍內。 數組中某些數字是重復的,但不知道有幾個數字是重復的。 也不知道每個數字重復幾次。請找出數組中任意一個重復的數字。 例如,如果輸入長度為7的數組{2,3,1,0,2,5,3},那么對應的輸出是第一個重復的數字2。
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM