圓圈中最後剩下的數字(劍指offer)

2021-10-04 13:56:50 字數 1016 閱讀 2571

題目:

0,1,n-1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。

例如,0、1、2、3、4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2、0、4、1,因此最後剩下的數字是3。

思路:

最直接的思路,我們模擬一下該過程,其實就是順序走,環形鍊錶。單鏈表,在走到最後就返回首部,就成了乙個圈。基於此,模擬過程:

class

solution

auto it=numbers.

begin()

;//這個方法定義迭代器簡直不要太簡單

int res=

*it;

while

(!numbers.

empty()

)}res=

*it;

numbers.

erase

(it)

;//迭代器刪除後移

if(it==numbers.

end())

}return res;

}

數學的方法一開始我沒有完全理解清楚,直到前幾天把蘋果題捋順,思路豁然開朗。100個蘋果拿最後乙個問題

看完這個,再看下面解法會好理解的多。

我們逆著來,最後剩下乙個人的時候,他必定是0位置。

那剩下兩個人的時候他在哪.(0+m)%2

剩下三個人的時候呢?((0+m)%2)%3

四個呢?五個呢?

n個呢?

其實這就是個遞迴的問題。所以按照這個思路,問題就簡單多了。

class

solution

return res;

}

其實還可以換種思路,每盤都能留下的那個人就是最後的贏家。所以,我們把12345-n的每盤的存活的回推。

習慣性最後感想,世界是數學的。世界是動腦筋的。世界的遞迴的。

劍指 圓圈中最後剩下的數字

1,題目 2,思路 方法一 用arraylist 模擬鍊錶 方法二 鍊錶 其實和方法一是一樣的 其實還有別的方法,但是自己沒有看懂,就沒有寫 3,方法一 用arraylist 模擬鍊錶 class solution int idx 0 while n 1 return list.get 0 方法二 ...

劍指offer 圓圈中最後剩下的數字

例如,0,1,2,3,4這五個數字組成的圓圈,每次從數字0開始刪除第3個元素,依次刪除的數為2,0,4,1,那麼剩下的為3。思路1 可以用stl模板庫裡面的list來模擬這個環形的鍊錶,因為list是線性的,所以為了實現環形的鏈,可以在遍歷到鏈的末尾的時候跳轉到鏈的開頭,這樣就相當於乙個環形鍊錶了,...

圓圈中最後剩下的數字

1.問題描述 題目0,1.n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。來自 劍指offer 2.分析 1 用環形鍊錶模擬圓圈,然後掃瞄鍊錶刪除結點,如果掃瞄到了鍊錶結尾,重新在指向鍊錶開頭以此來模擬環形鍊錶。typedef struct...