没有挫败只有越挫越勇,虽然有点遗憾,但是会更加努力,每一步都是下一步的坚实基础,加油!
我想这次经历只会赠与我一颗更加坚定的内心,内心强大了,才能在这一路将知识和能量像滚雪球一样,越滚越多,越滚越大。
这次题目其实很简单,就是考察的约瑟夫问题,一个a[N]的数组存放从0~N-1的数,然后每隔两个删去一个数,直到删完所有,求最后一个删除的数的原始下标。
总结这次机试的经验和教训:
1、没有注意时间,严重超时。
2、一开始因为觉得构造循环链表会比较复杂,所以选择用数组解决,后来发现数组解决逻辑会比较复杂,才改用链表。
3、做完后没有及时提交。
总之,在使用链表比较方便的算法问题上,尽量使用链表,否则为了避免构造数据结构的繁琐会造成后面实现过程的更加繁琐而适得其反。
以下是我的答题答案。
//约瑟夫问题
#include<stdio.h>
typedef struct node
{
int data;
node* next;
}*link,linknode;
//创建循环链表
link create(int n)
{
link r,head;
head=new linknode;
head->data=0;
r=head;
for(int i=1;i<n;i++)
{
link p=new linknode;
p->data=i;
r->next=p;
r=p;
}
r->next=head;
return head;
}
//获取下一个节点
link getNext(link head)
{
if(head==NULL)
return NULL;
return head->next;
}
//删除当前节点
link removeL(link head)
{
link p=head;//当前节点
link q=head;//前一个节点
while(q->next!=NULL&&q->next->data!=head->data)
{
q=q->next;
}
q->next=p->next;
delete p;
return q->next;
}
int ysf(int n,int m)
{
link head=create(n);
for(int i=0;i<n-1;i++)
{
for(int j=0;j<m;j++) head=getNext(head);
head=removeL(head);
}
int result=head->data;
delete head;
return result;
}
void main()
{
int n = ysf(8,2);
}