欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

解一道面试题

程序员文章站 2022-05-11 17:45:30
问题描述:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里 请找出丢失的数字,最好能有程序,最好算法比较快 假设n=10000 我的解题思路:...

问题描述:有一组数字,从1到n,从中减少了3个数,顺序也被打乱,放在一个n-3的数组里

请找出丢失的数字,最好能有程序,最好算法比较快
假设n=10000


我的解题思路:

我用bitmap法实现的。思路如下:
一个[1,m]的bitmap(求简单,每个元素都是bool类型),全部初始化为false。
第一步
便利目标数组,用每一个值作下表,找到bitmap中对应位置,置true。
第二部:
扫描bitmap中为true的节点,记录下来,这就是答案
只需要便利两次数组即可。

c代码如下:

关键解题函数:


void findlostnum(int* pdata, int ntotalnum, int* presult, int nlost) 
参数解释: pdata 指向一个整型数组,里面有ntotalnum个乱序数据元素,元素取值[1,ntotalnum+nlost] presult 指向一个结果整型数组,里面有nlost个节点,用来接收返回结果代码在vs2010下调试通过

#include <iostream> 
#include <math.h> 
using namespace std; 
 
#define n   (4000) 
#define lost <span style="white-space:pre">   </span>(3) 
 
typedef struct _node_num 

    bool bused;     //是否被用过 
}node_num, *pnode_num; 
 
//生成数表,[1,n]乱序。 参数:表头指针,总数,丢失的个数 
bool generaterandomnumset(pnode_num pdata, int ntotalnum, int nlostnum); 
 
//找出丢失的数字 
void findlostnum(int* pdata, int ntotalnum, int* presult, int nlost); 
 
bool generaterandomnumset(int* pdata, int ntotalnum, int nlostnum) 

    pnode_num plist  = null; 
    int index = 0; 
    int temp = 0; 
    int loc = 0; 
 
    if(pdata==null || ntotalnum<=0) 
        return false; 
     
    //初始化1-n数码顺序表 
    plist = new node_num[ntotalnum]; 
    if(plist == null) 
        return false; 
    for(index=0; index<ntotalnum; index++) 
    { 
        (plist+index)->bused = false; 
    } 
 
    /*初始化[1,n-lost]乱序数码表*/ 
    try 
    { 
        for(index=0; index<ntotalnum-nlostnum; index++) 
        { 
             
            loc = rand()%ntotalnum; 
            while(1) 
            { 
                if((plist+loc)->bused) 
                { 
                    loc++; 
                    if(loc >= ntotalnum) 
                        loc=0; 
                } 
                else 
                    break; 
            } 
            *(pdata+index) = loc; 
            (plist+loc)->bused = true; 
        } 
    } 
    catch(exception e) 
    { 
        cout<<"参数错误"; 
    } 
     
    delete plist; 
    return true; 

 
void findlostnum(int* pdata, int ntotalnum, int* presult, int nlost) 

    pnode_num plist = null; 
    int index=0; 
    int count = 0; 
 
    if(pdata==null || ntotalnum<=0 || presult==null || nlost<=0) 
        return; 
 
    //初始化1-n数码顺序表 
    plist = new node_num[ntotalnum+nlost]; 
    if(plist == null) 
        return; 
    for(index=0; index<ntotalnum+nlost; index++) 
    { 
        (plist+index)->bused = false; 
    } 
 
    //扫描给出数列,在plist中标记 
    for(index=0; index<ntotalnum; index++) 
    { 
        (plist+*(pdata+index))->bused =true; 
    } 
 
    for(index=0; index<ntotalnum+nlost; index++) 
    { 
        if(!(plist+index)->bused) 
        { 
            *(presult+count) = index; 
            count++; 
        } 
    } 

int main() 

    int* pdata = null; 
    int* presult = null; 
 
    pdata = new int[n]; 
    if(pdata==null) 
        return -1; 
 
    presult = new int[lost]; 
    if(presult==null) 
    { 
        delete pdata; 
        return -1; 
    } 
 
    generaterandomnumset(pdata, n, lost); 
 
    findlostnum(pdata, n-lost, presult, lost); 
 
    //输出结果 
    for(int index=0; index<lost; index++) 
        cout<<*(presult+index)<<"\t"; 
 
    //检验结果 
    for(int index=0; index<n-lost; index++) 
    { 
        for(int c=0; c<lost; c++) 
        { 
            if(*(pdata+index) == *(presult+c)) 
                cout<<endl<<"结果检验错误"; 
        } 
    } 
 
    delete pdata; 
    delete presult; 
    return 1; 


摘自 shyandsy的无边海洋