題目:
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...