免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4614 | 回复: 16
打印 上一主题 下一主题

[C] 一道面试题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-23 13:54 |只看该作者 |倒序浏览
最近做的一道面试题:一个整形数组 int a【1000】,内赋值0-999.然后从头开始每隔2个值删除一个,循环下去。例如:a[7],0-1-2(删除)-3-4-5(删除)-6-0-1(删除)...如此循环下去,直到全部删除完毕。
求最后一个删除值在数组a中的下标。

最近头脑不灵光,真没好思路。大家给点拨点拨,多谢了。

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
2 [报告]
发表于 2011-02-23 14:06 |只看该作者
约瑟夫环?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之水原三星
日期:2015-06-02 16:34:202015年亚冠纪念徽章
日期:2015-10-19 18:13:37程序设计版块每日发帖之星
日期:2015-11-08 06:20:00
3 [报告]
发表于 2011-02-23 14:17 |只看该作者
经常被面也经常面人这个题,可是这个东西用在哪里呢?

论坛徽章:
0
4 [报告]
发表于 2011-02-23 14:47 |只看该作者
约瑟夫环的简化版……

论坛徽章:
0
5 [报告]
发表于 2011-02-23 14:52 |只看该作者
603 ?

论坛徽章:
0
6 [报告]
发表于 2011-02-23 22:35 |只看该作者
好像是607

论坛徽章:
0
7 [报告]
发表于 2011-02-23 23:02 |只看该作者
这个我也遇到过,因为本人比较笨,数学基础不是很好,所以也没有什么特别取巧的办法,就是简单的循环删除。我记得当时我是用单向循环链表来做的,从头节点开始循环遍历,然后删除,直到一个节点的next是它本身,则说明只是最后剩下的,即为所求。

论坛徽章:
0
8 [报告]
发表于 2011-02-24 01:21 |只看该作者
循环999次 做标记
未标记的就是最后一个

论坛徽章:
2
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
9 [报告]
发表于 2011-02-24 01:45 |只看该作者
我算出来郎个是976呢

  1. #include <stdio.h>
  2. #include <string.h>

  3. #define LEN(a) (sizeof(a)/sizeof(a[0]))

  4. #define COUNT     1000

  5. int get_valid(const int *data, int len, int from, int *o_pos)
  6. {
  7.         int i;
  8.         for (i = from; i < len; i++) {
  9.                 if (data[i] == 0) {
  10.                         *o_pos = i;
  11.                         return 0;
  12.                 }
  13.         }
  14.         for (i = 0; i < from; i++) {
  15.                 if (data[i] == 0) {
  16.                         *o_pos = i;
  17.                         return 0;
  18.                 }
  19.         }
  20.         return -1;
  21. }

  22. int main(void)
  23. {
  24.         int data[COUNT];
  25.         int i;

  26.         memset(data, 0, sizeof(data));
  27.         i = 0;
  28.         while (get_valid(data, LEN(data), i, &i) == 0) {
  29.                 get_valid(data, LEN(data), i + 1, &i);
  30.                 data[i] = 1; /* delete */
  31.                 continue;
  32.         }
  33.         printf("last exist: %d\n", i);
  34.         return 0;
  35. }
复制代码

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
10 [报告]
发表于 2011-02-24 08:31 |只看该作者
感觉这样肯定走了弯路
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP