免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zz8880
打印 上一主题 下一主题

[算法] 人人网笔试题一道,小菜求解 [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2011-11-24 16:04 |只看该作者
已有的数是10,11,12,13,14,15,16,17,18
那么被抽掉的那个数是几啊?

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
12 [报告]
发表于 2011-11-24 16:24 |只看该作者
int func(int a[9],int r[2])
{
       int min,max,i;
       long long sum;
       sum=max=min=a[0];
       for(i=1;i<9;i++) {
              if(a[i]>max)max=a[i];
              if(a[i]<min)min=a[i];
              sum+=a[i];
       }
       if(max-min==9) {
               r[0] = (int)(sum-((long long)max+(long long) min)*5);
               r[1] = -1;
       } else {
               r[0]=max+1;
               r[1]=min-1;
       }
}
//r[0],r[1]如果是非负数,则是可能值

论坛徽章:
0
13 [报告]
发表于 2011-11-25 16:05 |只看该作者
回复 1# zz8880


    这个题目还涉及比较简单的

第一个

才10个,可以用 累加和 - 取走后的累加

第二个

直接采用二分法查找就可以了就可以

数列 a[1000000];
取走后数据形成的数列为
b[1000000-1];

L =0;
H=10000000;

第一次二分法,




a[H/2]==b[H/2]

则 取走的数据位于

[H/2,H]之间

若不等
则位于
[0,H/2]之间

答题思路就是这样

如此循环
二分法的时间复杂度 是多少?O(lgn)吗?

还有一种方法

就是一个一个比较咯

时间复杂度 O(n)


我能想到最好的方法就是这俩个了

论坛徽章:
0
14 [报告]
发表于 2011-11-25 18:28 |只看该作者
xor 吧,可能符合面试官的胃口,显得自己很有水平。
当然,也可以选素数乘法,显得更有水平。

论坛徽章:
0
15 [报告]
发表于 2011-11-26 09:42 |只看该作者
----------------------------
哪位大哥给介绍下?不懂
xfxfxy 发表于 2011-11-24 15:50



    查了下资料,是不是这样搞?
   [code]
    for (i = min; i < min+n; ++i)
          num ^= i;
    for (i = 0; i < n - 1; ++i)
        num ^= arr;[/code]
---------------------------但是有11楼说的问题呀,---

论坛徽章:
0
16 [报告]
发表于 2012-08-04 01:06 |只看该作者
异或:
1、具有结合性,
A ^ B ^ C  = A ^(B ^C) =(A ^ B) ^C
2、异或自己等于0 , 异或 0 等于 自己
A ^ A =0

SUM(N) :把数组的元素都异或一边,
SUM(N-1) : 把剩下的元素异或一次。

SUM(N-1) ^ X = SUM(N)

SUM(N-1) ^ X ^ SUM(N-1) = SUM(N) ^ SUM(N-1)

X = SUM(N) ^ SUM(N-1);


新手拙见。

论坛徽章:
0
17 [报告]
发表于 2012-08-04 12:33 |只看该作者
rejoice914 发表于 2012-08-04 01:06
异或:
1、具有结合性,
A ^ B ^ C  = A ^(B ^C) =(A ^ B) ^C


你这是交换,不是结合

论坛徽章:
0
18 [报告]
发表于 2012-08-04 12:36 |只看该作者
题目是给出了新数组,旧数组不知道,要你求少了什么数。1000万个数的大数组,只差一个数,难道人家搞两份?

论坛徽章:
0
19 [报告]
发表于 2012-08-04 12:47 |只看该作者
简单的方法就是搞一个临时数组,每次从源数组里取一个数n,如果它不在临时数组中,就考虑将n-1和n+1插入临时数组,如果它在临时数组中,就将它从临时数组中删掉。复杂度n^2ln(n)

论坛徽章:
0
20 [报告]
发表于 2012-08-04 13:03 |只看该作者
cjaizss 发表于 2011-11-24 16:24
int func(int a[9],int r[2])
{
       int min,max,i;


这个办法好,异或一下也就是o(n)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP