C++ 笔试题集锦(2)

来源:互联网 发布:h3c vlan加端口 编辑:程序博客网 时间:2024/06/16 21:26

本篇blog旨在收集平时遇到的一些“稀奇古怪”的面试题。上一篇笔试题blog地址


问题1: 出现频率

问题表述:
从100万url中,找到出现频率最高的100个。

解析:

#include <iostream>#include <fstream>#include <cstdlib>#include <string>#include <vector>#include <list>#include <algorithm>#include <windows.h>using namespace std;bool pcgreater(char *pc1, char *pc2){    if (strcmp(pc1, pc2) > 0)        return true;    else        return false;}int main(){    LONGLONG start_time;    LONGLONG end_time;    LONGLONG frequency;    LONGLONG elapsed;    double elapsed_time;    char **file = new char*[100 * 10000];    QueryPerformanceFrequency((LARGE_INTEGER*)&frequency);    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    srand(1000000);    char url[256];    int ilen;    string str;    for (int i = 0; i < 1000000; i++)    {        int iRand = rand() % 10000;        sprintf(url, "%c,%c,%d,%08x,%08X,", iRand % 26 + 'A', iRand % 26 + 'a', iRand, iRand, iRand, iRand);        str = url;        ilen = sprintf(url, "%s,%s,%s,%s,%s,%s,%s,%s,\r\n", str.c_str(), str.c_str(), str.c_str(), str.c_str(), str.c_str(), str.c_str(), str.c_str(), str.c_str());        file[i] = new char[ilen + 2];        memcpy(file[i], url, ilen + 1);    }    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "生成 100万条记录 使用的时间:" << elapsed_time << " 秒" << "\r\n" << endl;    cout << "\r\n" << endl;    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    FILE  *pflOut = fopen("milion_record2.txt", "wb");    for (int i = 0; i < 1000000; i++)    {        fputs(file[i], pflOut);    }    fclose(pflOut);    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "C写入文件使用的时间:" << elapsed_time << " 秒" << "\r\n" << endl;    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    ofstream outfile("milion_record.txt");    for (int i = 0; i < 1000000; i++)    {        outfile << file[i];    }    outfile.close();    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "C++写入文件使用的时间:" << elapsed_time << " 秒" << "\r\n" << endl;    //排序部分    vector<char *> file_list(1000000);    for (int i = 0; i < 1000000; i++)    {        file_list[i] = file[i];    }    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    sort(file_list.begin(), file_list.end(), pcgreater);    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "排序时间" << elapsed_time << " 秒" << "\r\n" << endl;    //找出最高100个部分    typedef struct{        char *str;        int iNum;    }FREQUENCY;    FREQUENCY tmp;    tmp.iNum = 0;    tmp.str = "999";    list<FREQUENCY> rank(100, tmp);    list<FREQUENCY>::iterator it_rank = rank.begin();    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    vector<char*>::iterator it, its;    int iNum = 1;    int ix;    its = file_list.begin();    for (it = its + 1; it != file_list.end(); it++)    {        if (strcmp(*it, *its) != 0)        {            iNum = it - its;            if (iNum > (*it_rank).iNum)                continue;            for (ix = 0, it_rank = rank.begin(); it_rank != rank.end() && ix<100; it_rank++, ix++)    //这里insert的效率不高,影响应当不大,不改了            {                if (iNum>(*it_rank).iNum)                {                    tmp.iNum = iNum;                    tmp.str = *its;                    rank.insert(it_rank, tmp);                    break;                }            }            its = it;        }    }    FILE *pflOut2 = fopen("the most 100.txt", "wb");    for (it_rank = rank.begin(), ix = 0; it_rank != rank.end() && ix < 100; it_rank++, ix++)    {        fprintf(pflOut2, "%d\t%s", (*it_rank).iNum, (*it_rank).str);    }    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "找出最高100个的时间" << elapsed_time << " 秒" << "\r\n" << endl;    QueryPerformanceCounter((LARGE_INTEGER*)&start_time);    FILE  *pflOut3 = fopen("milion_record3.txt", "wb");    for (int i = 0; i < 1000000; i++)    {        fputs(file_list[i], pflOut3);    }    fclose(pflOut3);    QueryPerformanceCounter((LARGE_INTEGER*)&end_time);    elapsed = end_time - start_time;    elapsed_time = (double)elapsed / frequency;    cout << "C写入文件使用的时间:" << elapsed_time << " 秒" << "\r\n" << endl;    return 0;}

问题2: const 和 define 的区别

const 为常量值,define为宏,宏不是常量,在预处理阶段用于替换。

  • const 在编译阶段使用;define在预编译阶段使用。

  • const 有数据类型,做安全检查;define无类型,不做安全检查。

  • const 占用一份内存,位于静态存储区;define不占用内存,但是会在使用到的地方进行原样替换。

1 0
原创粉丝点击