我的机试经历之一(华为)

没有挫败只有越挫越勇,虽然有点遗憾,但是会更加努力,每一步都是下一步的坚实基础,加油!

 

我想这次经历只会赠与我一颗更加坚定的内心,内心强大了,才能在这一路将知识和能量像滚雪球一样,越滚越多,越滚越大。

 

这次题目其实很简单,就是考察的约瑟夫问题,一个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);
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值