大四时候的一个面试题,当时没想出来,给大家分享一下

poiu710 2012-06-16 09:31:03
题目大意:
有这样一个数组,除其中一个元素(如下面的99),其它的都是成对出现的,如何能快速找出那99的位置
……102,102,2,2,44,44,99,23,23,11,11 ……
...全文
2589 106 打赏 收藏 转发到动态 举报
写回复
用AI写文章
106 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhenguo_lee 2012-06-20
  • 打赏
  • 举报
回复
#include <stdio.h>

static const int array[] = { 100, 100, 20, 20, 11, 11, 44, 44, 55, 55, 99, 23, 23, 45, 45, 67, 67 };

static const int find_single(const int *src, const int *dest)
{
if (*src != *dest)
return *src;
if (*src == *dest)
return find_single(src + 2, dest + 2);
return -1;
}

int main(void)
{
int ret;

ret = find_single(array, array + 1);
if (ret != -1)
printf("ret: %d\n", ret);
else
;

return 0;
}
jallyx 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 104 楼 的回复:]

二分法,怎么分?根本就不行,例如:1,2,2,2,2和2,2,2,2,1类似于这两个数组,有哪个高手可以用二分和递归告诉我怎么做?谢谢
[/Quote]

int find(int array[], uint length) {
if (length <= 1)
return 0;
uint begin = (length >> 1) & ~1;
uint end = begin;
while (1) {
if (++end >= length)
return find(array, begin - 1);
if (array[begin] == array[end]) {
if (begin == 0) {
++end;
return end + find(array + end, length - end);
}
--begin;
if (array[begin] != array[end]) {
if (begin & 1) {
++end;
return end + find(array + end, length - end);
} else {
return find(array, begin + 1);
}
}
} else {
if (begin & 1)
return end + find(array + end, length - end);
else
return find(array, begin + 1);
}
}
}

综合二分和遍历方法。
顺带拿分闪人。
景语 2012-06-20
  • 打赏
  • 举报
回复
学习了
MeAndJack 2012-06-20
  • 打赏
  • 举报
回复
二分法,怎么分?根本就不行,例如:1,2,2,2,2和2,2,2,2,1类似于这两个数组,有哪个高手可以用二分和递归告诉我怎么做?谢谢
MeAndJack 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

递归+折半查找。

这必须知道数组a的所有值的个数(n+1),而n+1必为奇数。数组a的序号为0到n。

left = 0; right = n; m = (left+right)/2;

int find99(left,right);

m = (n+0)/2,若m为偶数,也即m两边的数量都为偶数,分别判断a[m]与a[m-1]、a[m+1]的值,若与a[m-1]相等,则99必……
[/Quote]

这个方法根本就是不行的,如果出现的数组是 2,2,2,2,2,2,2,2,1这样的数组呢,那肯定是无法递归下去的,楼主想得太简单了。。。。。。这个问题只能用异或来解决
vanxining 2012-06-20
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 的回复:]

提问2#,请问M怎么会为奇数??m=(n+0)/2。。不管n是奇数还是偶数,m不都是偶数吗???
再说了,设一共有n+1个数,那么n一定是偶数,请问若原数组元素个数是偶数的话,怎么可能只有一个不配对,其他的都是两两成对????
[/Quote]
很明显,按照题意,m肯定是偶数的啦,我在麦库中记录这道题时就直接删了二楼关于m为奇数的那部分讨论
rustydaar 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 的回复:]

提问2#,请问M怎么会为奇数??m=(n+0)/2。。不管n是奇数还是偶数,m不都是偶数吗???
再说了,设一共有n+1个数,那么n一定是偶数,请问若原数组元素个数是偶数的话,怎么可能只有一个不配对,其他的都是两两成对????
[/Quote]

m为什么一定会是偶数?除2得到的不一定是偶数。
pupingpp 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 的回复:]

居然楼中这么多人喷2楼。。
喷二分查找的筒子支持的那个算法,顶天也是O(n),二分查找是O(lgn)。
这种行为犹如是在坚决支持冒泡排序,排斥快排,仅仅是因为快排不能一下子就能被理解
承认自己的错误不是什么难事,何况在网络上~
[/Quote]
能不能解释一下我提出的问题啊?谢谢了,我不是有意喷二楼,我只是想搞明白,因为马上就要毕业找工作呢,说不定还会遇到这样的题目啊。。。感谢
vanxining 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 的回复:]

引用 15 楼 的回复:

参考拙作:
一个百度的面试题目

几周前一个坛友问了一模一样的问题,俺就整理成了上面这篇博客。
这里我要说声抱歉,是我题目没有说清楚,成对,且相邻的。这个题是我10年12月(好像是12月,记不清了)广州大学城北亭广场现场面试题。
[/Quote]
真古老啊,亏楼主还记得
c090869 2012-06-19
  • 打赏
  • 举报
回复
试了两种方法,发现用位操作速度慢;
int i,j,k,a=10,b=10;
for(i=0;i<10000;i++)
for(j=0;j<10000;j++)
for(k=0;k<50;k++)
{
if(a^=b) a=10; // if(a==b) a=10;
}
printf("i=%d,%d.%d\n";i,j,k);
vanxining 2012-06-19
  • 打赏
  • 举报
回复
居然楼中这么多人喷2楼。。
喷二分查找的筒子支持的那个算法,顶天也是O(n),二分查找是O(lgn)。
这种行为犹如是在坚决支持冒泡排序,排斥快排,仅仅是因为快排不能一下子就能被理解
承认自己的错误不是什么难事,何况在网络上~
modicum_lf 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
题目大意:
有这样一个数组,除其中一个元素(如下面的99),其它的都是成对出现的,如何能快速找出那99的位置
……102,102,2,2,44,44,99,23,23,11,11 ……
[/Quote]

++

kangyuanxun 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

用位操作----异或操作。先全部异或一下得到了99.然后查找99的位置。
[/Quote]
全部异或?效率多少?还是二分查找好
youngwolf 2012-06-19
  • 打赏
  • 举报
回复
注意这个问题与排序与否真的没有一点关系,你只需要折半比较两个数,根据它相同与否,以及位置的奇偶性,就知道答案是在前面的子数组还是后面的子数组(二分法)
youngwolf 2012-06-19
  • 打赏
  • 举报
回复

void do_find_the_one_diff(int in_data[], size_t len, size_t index)
{
if (0 == index)
{
cout << "find the only diff: " << in_data[index] << endl;
return;
}

if (in_data[index - 1] != in_data[index])
{
len -= index;
in_data += index;
}
else
len = index - 1;

index = len >> 1;
if (index & 1)
++index;
do_find_the_one_diff(in_data, len, index);
}

void find_the_one_diff(int in_data[], size_t len)
{
if (len & 1)
{
size_t index = len >> 1;
if (index & 1)
++index;
do_find_the_one_diff(in_data, len, index);
}
}

int main()
{
int in_data[] = {1, 1, 3, 3, 2, 4, 4, };
size_t len = sizeof in_data / sizeof(int);
find_the_one_diff(in_data, len);
return 0;
}


最快当然是二分查找,根本不需要遍历,不需要存储。
风吹过的卫星 2012-06-19
  • 打赏
  • 举报
回复
其实不需要这么复杂,设两个相邻索引的指针,同时通过索引递增,当两个索引值不同时就找到了,位置也就确定了
ranchenwei 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 91 楼 的回复:]

稍微看了下回复,怎么那么多人说用二分查找?二分查找是针对有序序列的,请问下楼主说得题目,没说明数组是有序吧?
[/Quote]

请仔细看一下题目以及二分的思路,这题二分不能处理的情况在于重复元素而不是无序。
nice_cxf 2012-06-19
  • 打赏
  • 举报
回复
在85楼已经说过了,折半是有前提的:数对不能重复,也就是说不允许1,1,1,1这种
否则假定100个1,1个99,你往那边折啊?
Canvas 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 93 楼 的回复:]
引用 本人 的回复:

递归+折半查找。

这必须知道数组a的所有值的个数(n+1),而n+1必为奇数。数组a的序号为0到n。

left = 0; right = n; m = (left+right)/2;

int find99(left,right);

m = (n+0)/2,若m为偶数,也即m两边的数量都为偶数,分别判断a[m]与a[m-1]、a[m+1]的值,若与……
[/Quote]

折半查找需要的是有序....
等你把数组有序得来,结果都出来了
qixing1115 2012-06-19
  • 打赏
  • 举报
回复
[Quote=引用 本人 的回复:]

递归+折半查找。

这必须知道数组a的所有值的个数(n+1),而n+1必为奇数。数组a的序号为0到n。

left = 0; right = n; m = (left+right)/2;

int find99(left,right);

m = (n+0)/2,若m为偶数,也即m两边的数量都为偶数,分别判断a[m]与a[m-1]、a[m+1]的值,若与a[m-1]相等,则99必……
[/Quote]
折半
加载更多回复(83)
课程介绍 仓库管理系统主要功能有采购入库,采购退货,销售出库,销售退货,仓库盘点,库存报表,Excel导入导出,按钮级权限控制及系统日志等功能,系统采用SpringBoot ,mybatis,easyui,ajax,mssql数据库等技术开发。提供所有源代码下载,系统功能完善,可直接运行。开发环境项目开发语言:SpringBoot ,mybatis,easyui,ajax,mssql数据库项目运行环境:jdk1.8及以上版本,tomcat8.0及以上版本,sql server2005及以上版本项目开发工具: 本项目开发工具是Intellij Idea课程目标掌握SpringBoot等技术,熟悉仓库管理系统主要功能,采购入库,采购退货,销售出库,销售退货,仓库盘点,系统报表,权限控制及日志等50多门JAVA系列全套课程,包括大一新生到大四毕业的所有JAVA系列技术专业课程,项目实战,商业项目等;基础课程:JAVA初级工程师: 1、计算机基础 2、HTML语言基础 3、C语言从入门到精通+贪吃蛇游戏 4、贪吃蛇游戏 5、SQL SERVER数据库基础 6、JAVA从入门到精通+推箱子游戏+QQ即时通讯软件 7、推箱子游戏; 8、仿QQ即时通讯软件;JAVA中级工程师: 9、SQLSERVER数据库高级 10、SQLSERVER从入门到精通(基础+高级) 11、JavaScript从入门到精通, 12、JSP从入门到精通+点餐系统, 13、JSP从入门到精通+在线视频学习教育平台, 14、JSP从入门到精通+大型电商平台; 15、XML从入门到精通, 16、数据结构(JAVA版),JAVA高级工程师: 17、Oracle数据库从入门到精通, 18、ajax+jquery从入门到精通, 19、EasyUI从入门到精通,SSH框架: 20、Struts2从入门到精通课程, 21、Hibernate从入门到精通课程, 22、Spring从入门到精通课程; 23、Echarts从入门到精通, 24、Excel基于POI的导入导出工作流框架: 25、Activiti流程框架从入门到精通 26、JBPM流程框架从入门到精通SSM框架: 27、MyBatis从入门到精通 28、Spring MVC从入门到精通 29、Spring Boot入门到精通 30、Spring Cloud入门到精通面试题: 31、职业生涯规划及面试题集锦商业项目: 32、微信公众号在线支付系统 33、微信生活缴费在线支付系统 34、支付宝生活缴费在线支付系统 35、在线考试系统 36、人脸识别智能考试系统(人工智能AI) 37、仓库管理及质量追溯系统 38、房屋出租管理系统APP(身份证识别) 39、手机订餐管理系统, 40、CRM客户关系管理系统 41、大型房地产CRM销售管理系统 42、CMPP2,CMPP3移动网关系统 43、仓库管理系统(SpringBoot) 44、影院在线售票系统(仿猫眼电影)人工智能: 45、人脸识别在线考试系统 46、人脸识别系统项目实战 47、车牌识别停车场管理系统 48、身份证识别系统项目实战 49、营业执照识别系统项目实战 50、名片识别管理系统

69,396

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧