总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
圆圈中最后剩下的数字
0,1,……,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里面删除第m个数字。求出这个圆圈里剩下的最后一个数字。
解题思路:
1.使用容器模拟一个环形链表来解答。
可以AC的解法【C++版本】
#include <iostream>
#include <vector>
#include <list>
using namespace std;
int LastRemaining_Solution(int n, int m);
int main() {
cout << LastRemaining_Solution(5, 3) << endl;
system("pause");
return 0;
}
int LastRemaining_Solution(int n, int m) {
if (n < 1 || m < 1)return -1;
//使用vector来模拟一个环形链表
vector<int> num;
for (int i = 0; i != n; i++) {
num.push_back(i);
}
int start = 0;
while (num.size() > 1) {
int cntDown = m;
int mv = start;
while (--cntDown) {
//如果遍历到了最后一个数字,下一个遍历数组首个数字
if (mv == (num.size() - 1)) {
mv = 0;
}
else {
mv++;
}
}
if (mv == (num.size() - 1)) {
start = 0;
}
else {
start = mv;
}
num.erase(num.begin()+mv);
}
return num[0];
}