posts - 76, comments - 1, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

C++面试题集3

Posted on 2006-10-31 11:48 小丑 阅读(146) 评论(0)  编辑 收藏 引用 所属分类: C/C++

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 中)


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理