2020-06-28
1.题目描述
0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈
里剩下的最后一个数字。
2.题解
1.循环链表:超时
2.公式法:注意这里表示幸存在这一轮的的人的下标位置
class Solution {
public:
struct LinkNode{
LinkNode* next;
int val;
};
int lastRemaining(int n, int m) {
if (!n||!m) return -1;
if (n==1) return 0;
m=m%n;
LinkNode* root=new LinkNode;
root->val=0; // 头节点
LinkNode* p=root;
for (int i=1;i<n;i++){
LinkNode* tmp=new LinkNode;
tmp->val=i;
p->next=tmp;
p=tmp;
}
p->next=root; // 循环链表
LinkNode* pre=p; // 用于连接
p=root; // 从根节点开始
for (int i=0;i<n-1;i++){
for (int j=1;j<m;j++){
pre=p;
p=p->next;
}
pre->next=p->next;
p=pre->next;
}
return p->val;
}
};
class Solution {
public:
int lastRemaining(int n, int m) {
if (!n||!m) return -1;
if (n==1) return 0;
int res=0;
for (int i=2;i<=n;i++){
res=(res+m)%i;
}
return res;
}
};