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