一道腾讯的面试题
来源:互联网 发布:淘宝开网店照片怎么拍 编辑:程序博客网 时间:2024/05/19 09:02
这是今天逛CSDN时看到的一道题,刚好这几天看了位向量和位运算,于是很有兴致的做了一做。本来这道题是出在JavaScript区的,不过我还是用C做了。
请找出丢失的数字,最好能有程序,最好算法比较快
假设n=10000
题目地址:http://topic.csdn.net/u/20111228/16/73a64b36-eddf-4013-803a-666157808071.html
我的思路剖析:
1.申请一个数组,长度为n,每个字节初始化为1
2.遍历待检查的数组,取出值作为索引对应之前申请的数组相应位置为0
3.遍历第1步里面的数组,如果相应位为1则把该数组下标加1后添加到结果集中
以上就是一个最容易理解的思路,不过这个还可以进一步改进。
算法改进:
我们可以用位向量来存储域(这个域就是1到n),这样我们申请 (n+7)/8 *8bit 的空间就好了,因为C里面没有bit的直接I/O,所以我们通过位运算来实现。具体看了代码就明白了。
代码如下:
/*result:存放结果集的数组 dest:提供的待检查的数组destLength:待检查的数组的长度n:完整域*/int func(int* result,int dest[],int destLength,int n){ int resultCount =0; int BitCharLength = (n+7)/8; int i; if ((n-destLength)==0) {//待检查数组长度等于域长度 return -1; } char* BitChar = (char*)malloc(BitCharLength*sizeof(char)); if (BitChar==NULL) {//申请位向量空间失败 return -2; } result = (int*)malloc((n-destLength)*sizeof(int)); if (result==NULL) {//申请结果集空间失败 return -3; } for (i = 0;i<(n+7)/8; i++) {//位向量所有位都置1 BitChar[i] = 127; } for (i = 0; i<destLength; i++) { //把dest[i]在BitChar中对应的bit置为0 BitChar[dest[i]>>3] &=~(1<<(dest[i] & 7)); }//这个完成以后存在的bit位全置0了,不存在的还是1; for (i = 0; i<(n+7)/8; i++) {//把BitChar[i]中为一的位对应的索引写到result中 if ((BitChar[i] & 1) != 0) {//00000001 resultCount++; result[resultCount]= 8*i+1; } if ((BitChar[i] & 2) != 0) {//00000010 resultCount++; result[resultCount]= 8*i+2; } if ((BitChar[i] & 4) != 0) {//00000100 resultCount++; result[resultCount]= 8*i+3; } if ((BitChar[i] & 8) != 0) {//00001000 resultCount++; result[resultCount]= 8*i+4; } if ((BitChar[i] & 16)!= 0) {//00010000 resultCount++; result[resultCount]= 8*i+5; } if ((BitChar[i] & 32)!= 0) {//00100000 resultCount++; result[resultCount]= 8*i+6; } if ((BitChar[i] & 64)!= 0) {//01000000 resultCount++; result[resultCount]= 8*i+7; } if ((BitChar[i] &128)!= 0) {//10000000 resultCount++; result[resultCount]= 8*i+8; } if (resultCount == (n - destLength)) { return resultCount; } } return resultCount;}
- 腾讯的一道面试题
- 腾讯的一道面试题
- 一道腾讯的面试题
- 腾讯的一道面试题
- 腾讯的一道面试题
- 腾讯的一道面试题
- 一道腾讯面试题
- 一道腾讯面试题
- 一道腾讯面试题 .
- 一道腾讯面试题
- 一道腾讯面试题
- 腾讯一道面试题
- 腾讯一道找中位数的面试题
- 一道腾讯公司的面试题
- 腾讯的一道Script面试题
- 网上看到的一道腾讯面试题
- 试着解一道腾讯面试题
- 一道腾讯安全部面试题
- Oracle 11g重要特性
- 设计模式——责任链模式_Chain of Responsibility Pattern
- swf导出exe
- Oracle之常用FAQ--Oracle 构架体系
- 用java写一个HelloWorld
- 一道腾讯的面试题
- Android Market 架构设计解析
- ExtJs2.0学习系列(2)--Ext.Panel
- 火狐插件- 显示时区 FoxClocks
- SQL 语句汇总(三)
- 随即数的生成方式
- SQL语句汇总(二)
- jquery地址
- (数据结构与算法分析 三)------栈的实现(包括链栈和数组实现栈 Java语言描述)