• (转载)c/c++笔试面试题(2)


    c/c++笔试面试题(2)

    int Strcmp(char *str1, char *str2)
    {
       int i=0;
       int b=0;
       while(str1[i]||str2[i])
       {
          if(str1[i]>str2[i])
          {
             b=1;break;
          }
          else if(str1[i]<str2[i])
          {
             b=-1;break;
          }
          i++;
       }
       return b;
    }

    ***************************************************************************************************************
    1.说出下面这个程序的运行结果,并简要叙述其理由:

    char buf1[10]="hello";
    char buf2[10]="hello";
    if (buf1==buf2)
    printf("equal!");
    else printf("not equal!");
    因为buf1,buf2分配了不同的内存块,而比较的是数组名,实际上是两个分别指向数组起始元素地址的指针。

    2.指出下面这段程序中存在一些什么问题:

    int loop,a[5];
    int* p=a;
    for (loop=0;loop<5;loop++)
    { p++;
    *p=loop;
    }

    数组a[5]在创建时没有初始化, 在for循环里也没有起到完全初始化数组的作用,而且对一块未知内存赋值。在最后一轮循环
    结束时p指向了数组a[5]的最后一个元素的下一个地址。

    string 系列

    char * strcpy( char *strDest, const char *strSrc ) 
    {
     assert( (strDest != NULL) && (strSrc != NULL) );
    char *address = strDest; 
     while( (*strDest++ = * strSrc++) != ‘/0’ ); 
    return address;
    }

    char* strncpy(char* strdest, const char* strsrc, int n)
    {
       assert((strdest != NULL) && (strsrc != NULL));
       char* address = strdest;
       while(n-- > 0)
          *strdest++ = *strsrc++;
       return address;
    }

    int strcmp(const char* str1, const char* str2)
    {
       assert((str1 != NULL) && (str2 != NULL);
       int ret = 0;
       while (!(ret = (unsigned char*)*str1 - (unsigned char*)*str2) && (*str2))
       {
          str1++;
          str2++;
       }
       if (ret > 0)
          ret = 1;
       else if (ret < 0)
          ret = -1;
       return ret;
    }

    int strlen(const char* str)
    {
       assert(str != NULL);
       int len = 0;
       while ('/0' != *str++)
          len++;
       return len;
    }
    类string的构造函数
    string::string(const char* str)
    {
       if(str == NULL)
       {
          m_data = new char[1];
          *m_data = '/0';
        }
        else
        {
           int length = strlen(str);
           m_data = new char[str + 1];
           strcpy(m_data, str);
         }
    }

    string 的析构函数
    string::~string()
    {
       delete [] m_data;
    }

    string 的拷贝构造函数
    string ::string(const string& other)
    {
       int len = strlen(other.m_data);
       m_data = new char[len + 1];
       strcpy(m_data, other.m_data);
    }

    string 的赋值函数
    string& string::operator=(const string& other)
    {
       if (this == &other)
          return *this;
       delete [] m_data;
       int len = strlen(other.m_data);
       m_data = new char[len + 1];
       strcpy(m_data, other.m_data);
       return *this;
    }  


    不用任何局部和全局变量实现int strlen(char *a)

    int strlen(char *a) {
        if('/0' == *a)
            return 0;
        else 
            return 1 + strlen(a + 1);
    }


    1)sizeof相关系列问题
    2)const相关系列问题
    3)大量林锐书的习题,以及各种变种
    这三个几乎是每次必出现
    下面的这些是程序相关题,很多都是以前有讨论过的,还请各位大侠能整理个比较适合做面试时答案的解答,多谢了.最好能给出
    讨论链接,让我等后辈有学习的机会.
    1)求出相似度的算法.
    2)写出二分查找的代码.
    int binary_search(int* arr, int key, int n)
    {
       int low = 0;
       int high = n - 1;
       int mid;
       while (low <= high)
       {
          mid = (high + low) / 2;
          if (arr[mid] > k)
             high = mid - 1;
          else if (arr[mid] < k)
             low = mid + 1;
          else
             return mid;
       }
       return -1;
    }
       
    3)写出在母串中查找子串出现次数的代码.
    *4)写出快速排序或者某种排序算法代码
    出现次数相当频繁
    5)写出查找从一个集合中输出所有子集合的算法.
    *6)实现strcpy函数
    char* strcpy(char* dest, const char* src)
    {
       assert((dest != NULL) && (src != NULL));
       char* address = dest;
       while ('/0' != (*dest++ = *src++));
       return address;
    }
    出现次数相当频繁
    *7)实现strcmp函数
    int mystrcmp(const char* str1, const char* str2)
    {
       assert((str1 != NULL) && (str2 != NULL));
       int ret = 0;
       while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)
       {
          str1++;
          str2++;
       }
       if (ret > 0)
          ret = 1;
       else if (ret < 0)
          ret = -1;
       return ret;
    }
       
    出现次数相当频繁
    8)将一个单链表逆序
    struct test
    {
       int number;
       double score;
       test* next;
    }
    void reverse(test*& head)
    {
       test* pe = head;
       test* ps = head->next;
       while(ps != NULL)
       {
          pe->next = ps->next;
          ps->next = head;
          head = ps;
          ps = pe->next;
        }
    }  
       
          
          
    9)循环链表的节点对换和删除。
    *10)将一个数字字符串转换为数字."1234" -->1234
    #i nclude<iostream>
    using namespace std;

    int f(char* s)
    {
       int k = 0;
       while (*s)
       {
          k = 10 * k + (*s++)- '0';
          
       } 
       return k;
    }

    int main()
    {
       int digit = f("4567");
       cout<<digit<<endl;
       cin.get();
    }
    出现次数相当频繁
    11)实现任意长度的整数相加或者相乘功能。
    *12)写函数完成内存的拷贝
    一个内存拷贝函数的实现体

    void *memcpy(void *pvTo,const void *pvFrom,size_t size)

    {

    assert((pvTo!=NULL)&&(pvFrom!=NULL));

    byte *pbTo=(byte*)pvTo; //防止地址被改变

    byte *pbFrom=(byte*)pvFrom;

    while (size-- >0)

    *pbTo++ = *pbForm++;

    return pvTo;

    }

    出现次数相当频繁


    .笔试: 
    1)写一个内存拷贝函数,不用任何库函数.就是前些时候本版讨论的那个问题.
     void* memcpy(void* pvTo, const void* pvFrom, size_t size)
     {
        assert((pvTo != NULL) && (pvFrom != NULL));
        byte* pbTo = pvTo;
        byte* pbFrom = pbFrom;
        while (size-- > 0)
        {
           *pbTo++ = *pbFrom++;
        }
        return pvTo;
     }
    2)将一个单链表逆序.(这个问题是个常规的数据结构问题.不过不小心时会损失效率) 
    3)客房预定的问题.根据客户报的人数,客房等级来从预备的客房中选择出所有符合要求的

    客房号.客户没有要求等级时,只考虑人数因素就可以了.要考虑有些客房已经预定的情况.

    (写代码是要考虑好彼此的效率) 
    4)对于一个无序序列进行二分查找 
    线排序再查找

    5)将一个数字字符串转换为数字."1234" -->1234
    int convert(char* str)
    {
       int k = 0;
       while (*str != '/0')
       {
          k = k * 10 + *s++ - '0';
       }
       return k;

    6)在文件(调用库函数创建的,不用考虑数据库的方式)中读入信息(包括职工号,职工产量)

    .根据输入的信息(包括职工号,职工产量)..检测是否有相同的职工号记录,如有,则增加其

    产量.如没有,则创建新的记录.最后的记录排序的依据是职工产量(降序),如果产量相同,则

    按职工号(升序). (具体的题目记不太清了,这个题目有点长.哪位也去笔试了.请修正一下

    子) 

    2.面试 
    1)找出两个中文句子的相似度.(例如"中国江苏南京" "江苏省中国南京市".实际上是指的

    同一个地方.面试官的要求是一分钟给出求相似度的算法.)(幸好听老师讲过中文分词,要不

    然当场就挂了) 
    2)写出二分查找的代码. 
    3)将上述代码通用化.(在 C 的规范内.就是我前面所的那个问题) 
    4)写出在母串中查找子串出现次数的代码.(不顾及效率时好说.当时一不留神把 KMP 说了

    出来,结果又让我描述整个过程.汗..只好从头又学了.不过没有冷场,边学边说.hoho) 
    5)如何看待在函数中定义很多静态变量. 
    6)写出quick_sort 
    7)写出查找从一个集合中输出所有子集合的算法. 
    8)有关于各种类型指针.各种数据类型的 sizeof 运算结果( 在 C 中)

    原文地址:http://www.cnblogs.com/dongsheng/articles/2793136.html

  • 相关阅读:
    实例天天向上的力量
    实例天天向上的力量
    数字类型及操作
    基本数据类型
    函数与模块
    Turtle库(海龟)
    python猛蛇绘制
    输出函数
    循环语句
    集合
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/8616691.html
Copyright © 2020-2023  润新知