随笔分类 - C/C++面试题目
摘要:字符串压缩,将原来的字符串转化为字符串里的字符+该字符串出现的次数,如
输入:12334222
输出:1121324123
可借助于sprintf函数实现。
阅读全文
摘要:将一个字符串中的单词进行倒置,标点符号也倒置,
如输入:hello,nice to meet you!
输出:!you meet to nice,hello
将代码中的while ( *pCur && IsAlphabet(*pCur) )
换成while ( *pCur && *pCur!= ' ' )
即可实现翻转单词,标点符号不倒换,
即输入:hello,nice to meet you!
输出:you! meet to hello,nice
阅读全文
摘要:模拟C++中的strstr函数,将主串中子串以及以后的字符串全部返回。
注意:
考虑所有可能的测试用例,包括子串存在、不存在,以及子串、主串为空的情况等。
阅读全文
摘要:用后缀数组求一个字符串中重复出现的最长的子串。
用C++中的string类可以很方便地进行操作,需将后缀数组保存在vector,如下面代码中的string版本所示,但这样就会因为有很大的开销;
直接用字符指针指向后缀字符串的首地址,可以节省很大的空间,如下面代码中的char *版本所示.
注意使用char *版本时,用qsort函数最后缀字符串数组排序,需要提供comp函数,该函数的写法如下:
阅读全文
摘要:在面试宝典上看到的题目,自己做了一下,用了C++中的string类,比较方便。
注意:
VC6.0 对C++的STL支持不是很好,有的方法不支持,如下面代码中的 srcStr.clear();在VS2008中可以运行无措,但在VC6.0中就会报错如下:
error C2039: 'clear' : is not a member of 'basic_string,class std::allocator '
解决方法如下:
用可以完成相同功能的subStr.erase(0,subStr.length());替代,不会报错。
目前还没发现其他更好的办法,如有发现,还请分享一下哦!
阅读全文
摘要:注意几点:
对于复数平均值的题目,要注意数据类型,在代码中有详细的说明;
注意输入非法的检查;
注意边界条件的测试。
阅读全文
摘要:1 字串转换
问题描述:
将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
阅读全文
摘要:华为公司2014届校园招聘软件类上机考试样题
需进行上机考试的岗位:软件开发工程师、操作系统工程师、底层软件开发工程师、云计算开发工程师、DSP工程师
在线考试:机考系统的内核为VS2005及JDK1.7,使用Java答题时,类名必须为“Main”;使用C/C++答题时,使用VS2005支持的数据类型和函数。
题目类型:涉及数组、链表、指针、字符串、循环、枚举、排序等等。
考试时长:2小时
考试题目:3道题(共计320分),初级题(60分),中级题(100),高级题(160分),难度递增。
阅读全文
摘要:面试题39:求二叉树的深度、判断二叉树是否为平衡二叉树
小结:
根据平衡二叉树的定义,需要判断每个结点,因此,需要遍历二叉树的所有结点,并判断以当前结点为根的树是否为二叉树;
用后序遍历的方式,先判断左右子树是否为平衡的,在判断当前节点;
可以对每个结点求深度,根据深度判断,如函数IsBanlancedTreeBasic所示,但这种方法存在重复遍历,效率较低;
后序遍历时,一边判断是否为平衡二叉树,一边求而二叉树的深度,这样就避免了重复遍历,如函数IsBanlancedTree所示。
阅读全文
摘要:找出数字在排序数组中出现的次数。
注意几点:
一开始试图用size_t类型表示数组的下标begin、end,到那时这样做在end = 0时,end - 1是size_t类型的最大值,仍然满足begin = end,但此时将会对sortedArray数组中下标为size_t类型的最大值的元素,会出现访问越界;因此,对于数组小标,不要为了保证是整数二用size_t类型,用int类型比较好。
若用int型表示,就不需要用STATUS的状态标志,下面的程序中没有修改这一点。
阅读全文
摘要:八大排序方法汇总(选择排序-简单选择排序、堆排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序,归并排序,计数排序)。
插入排序还可以和折半查找相结合,提高查找插入位置的速度,也就是折半插入排序,此处没有给出这种方法的相应代码。
对排序算法,可从以下几个方面评价:
时间复杂度;
空间复杂度;
稳定性。
阅读全文
摘要:循环链表、数组解决约瑟夫环问题的比较。
注意几点:
循环链表的建立不难,在删除循环链表中元素时,用pCur->next != pCur判断结束;
每一轮计数开始,将计数器归1,counter = 1;
并将指针指向下一个元素,pCur = pCur->next; //从下一个元素开始计数
阅读全文
摘要:链式存储的队列的实现,包括队列的初始化、销毁、入队、出队、测长、获取队首元素等基本操作。
注意几点:
队列结构,包含一个头指针、一个尾指针,初始化为空队列,空队列的队首指针与队尾指针相同;
链表包含头结点,否则在队列为空以及队列只有一个元素时都是队尾至真与队首指针相等,无法区分
有动态分配空间,就要释放,本实现中用DestoryQueue释放动态内存;
带有头结点,队列的第一个元素在头指针指向的结点中,对非空队列,队列中第一个元素为q.front->next->data; 而非q.front->data;
在出队以及获取队首元素时,要考虑队列空否,本实现中用assert( !IsQueueEmpty(q) ); 检查。
阅读全文
摘要:两个栈实现一个队列,包括队列的初始化、销毁、入队、出队、测长、判断空否、显示队列元素等操作。
小结:
用两个栈作为队列结构,一个用于入队,另一个作为出队的辅助栈,如代码中栈sEnQueue、sDeQueue为队列结构的两个成员;
初始化队列,即两个栈的初始化,如代码中函数InitQueue;
队列销毁,即两个栈的销毁,如代码中函数DestoryQueue;
出队,若sDeQueue为空,则将sEnQueue的元素倒入sDeQueue,然后取其栈顶元素;若非空,直接取其栈顶元素;
入队,即sEnQueue的入栈操作;
队列测长,即两个栈的长度值之和;
注意队列的显示总,两个栈的显示顺序不同,才能得到正确的显示。
阅读全文
摘要:顺序存储的栈的缺点:
存储空间有限,当栈中元素个数超出定义的栈的MAXSIZE时,再进行插入,就会出现访问越界。当然,可以通过realloc重新分配内存以扩大容量,不过这样不但会增加复杂度,而且要求存储空间是连续的,当内存中没有这么大的连续空间时,就会发生内存溢出;
为了解决这个问题,链式存储的栈不失为好的办法,下面是用链表实现的栈。
用链式存储是实现栈时,注意几点:
将链表头结点作为栈顶,而且也不需要附加的头结点;
栈的结构只有一个链表指针;
栈的初始化,就是将链表头结点置为NULL;
栈的销毁,就是链表的销毁;
栈的push、pop,就是在链表的头部进行插入、删除的操作,在pop时,注意对空栈的处理,下面的代码中用assert(NULL != s.top);检查是否为空;
求栈的长度的操作,就是求链表长度;
获取栈顶元素,就是获取链表头结点元素,注意对空栈的处理,下面的代码中用assert(NULL != s.top);检查是否为空。
阅读全文
摘要:顺序存储的栈的实现,包括初始化、销毁、push、pop、求长度、显示栈中元素、获取栈顶元素等基本操作。
注意:
通过动态申请的空间一定要销毁,本实现在InitStack函数中申请空间,使用完后在函数DestoryStack中销毁;
栈显示时,注意下标的更新不是在while条件判断时,应在显示元素之后,如下:
阅读全文
摘要:素数、最大公约数、最下公倍数、质因数分解都是与素数相关的,解决了素数的问题,其他的都可以此为基础求解。
小结:
求1到n之间的素数的基本方法是通过遍历2到sqrt(n),判断每个数是否是素数来得到,但这种方法效率很低;比较高效的解法是通过筛选法求解,如下面代码中函数GetPrimeUnderNBySieve;
最大公约数可通过GCD递归定理求解,通俗的说法就是辗转相除法,《算法导论》中有详细的说明;
最下公倍数可通过最大公约数得到,公式为:LCM(a,b) = a*b / GCD(a,b);
质因数分解可通过质数表得到,如下面代码中函数GetPrimeFactorByPrimeTable所示;
另外,最后一种因数分解代码是最简练的,如函数Decomposition所示,
阅读全文
摘要:再次写链表的基本操作,包括前插法创建链表、链表的插入、删除、排序、翻转、显示、销毁。
此次写的链表时带有头指针的,是否有头指针,对于链表的各个操作都会有影响,与之前写的不带头指针的链表相比,确实方便很多,不易出错。
小结:
对于带有头结点的链表,空链表(pHead->next= NULL)与头指针为NULL的链表(pHead = NULL)是不同的,后者是非法的链表,要当做异常处理;
函数入口对于异常输入的处理,比如下面代码中多个函数中的assert(pHead != NULL);排除了链表头结点为空的异常情况;
函数对于特殊输入的处理,比如插入、删除的位置大于链表长度,以及链表为空的处理;链表翻转时链表长度为空或1时直接返回即可;在函数开始时最好就对这些特殊的输入进行处理,以免遗漏;
存放插入、删除的位置、链表长度的变量为size_t类型的,排除了非法的负数的情况,但也要注意这种做法带来的副作用,就是对于size_t类型的变量0-1的结果为最大的正数,而非负数,判断循环结束时,应注意到这个问题。
输入ctrl+z结束键盘输入后,要想再次从键盘接收输入,必须用
阅读全文