![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++笔试题目
文章平均质量分 72
Citronnelle2
这个作者很懒,什么都没留下…
展开
-
《剑指Offer》学习笔记--面试题47:不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算。面试的时候被问到这个问题很多人在想:四则运算都不能用,那还能用什么啊?可问题总是要解决的,我们只能打开思路去思考各种可能性。首先可以分析人们是如何做十进制加法的,比如如何得出5+17=22这个结果的。实际上,我们可以分成三步进行:第一步只做各位相加不进位,此时相加的结果是12;第二步做进位,5+7中有进位,进位的值原创 2015-05-15 10:21:52 · 352 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题20:顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1,2原创 2015-05-08 18:23:59 · 397 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不等。例如序列1,2,3,4,5是某栈的压入序列,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字一次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数原创 2015-05-10 14:41:54 · 334 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题30:最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。解法一:O(n)的算法,只有当我们可以修改输入的数组的时候可用从解决面试题29“数组中出现次数超过一半的数字”得到了启发,我们同样可以基于Partition函数来解决这个问题。如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数字原创 2015-05-11 19:29:43 · 377 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题23:从上往下打印二叉树
题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};这道题实质是考察树的遍历算法,只是这种遍历不是我们熟悉的前序,中序或者后序遍历。由于我们不原创 2015-05-10 19:27:17 · 256 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题24:二叉搜索树的后序遍历
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。分析,在后序遍历得到的序列中,最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分:第一部分是左子树结点的值,它们都比根结点的值小;第二部分是右子树结点的值,它们都比根结点的值大。以数字{5,7,6,9,11,10,8}为例原创 2015-05-10 19:57:03 · 333 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题25:二叉树中和为某一直的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶节点所经过的结点形成一条路径。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};一般的数据结构和算法的教材都原创 2015-05-10 20:34:13 · 359 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题26:复杂链表的复制
题目:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下:struct ComplexListNode{ int m_nValue; Comp原创 2015-05-11 12:56:31 · 409 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题27:二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。二叉树结点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};在二叉树中,每个结点都有两个指向子结点的指针原创 2015-05-11 13:57:34 · 318 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题28:字符串的排列
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba.我们求整个字符串的排列,可以看成两步:首先求所有可能出现在第一个位置的字符,即把第一个字符和后面所有的字符交换。第二步固定第一个字符,求后面所有字符的排列。这个时候我们仍把后面的所有字符分成两部分:后面的第一个字原创 2015-05-11 15:38:39 · 335 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题31:连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。解法一:举例分析数组的规律我们试着从头到尾逐个累加示例数组中的每个数字。初始化和为0。第一步加上第一个数字1,此时和为原创 2015-05-12 11:36:21 · 376 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题32:从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。不考虑时间效率的解法,靠它想拿到Offer有点难如果在面试的时候碰到这个问题,应聘者大多能想到最直观的方法,也就是累加1到n中每个整数1出现的次数。我们可以每次通过对10求余数判断整数的个位数字是不是1.如果这个数字大于10,除以10原创 2015-05-12 12:25:28 · 384 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题38:数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.假设我们是统计数字k在排序数组中出现的次数。在前面的算法中时间主要消耗在如何确定重复出现的数字的第一个和最后一个k的位置上,有没有肯能用二分查找算法直接找到第一个k及最后一个k呢?我们首先分析如何用二分查找算法在数组中找到第一个k。二分查找算法总是先拿原创 2015-05-13 16:12:13 · 336 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.解法一:基于Partition函数的O(n)算法如果我们回到题目本身仔细分析,就会发现前面的思路并没有考虑到数组的特性:数组中有一个数字出现的次数超过了数组长度的一半。如果把这个数组排序,那么排序原创 2015-05-11 15:55:22 · 588 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题33:把数组排成最小的数
题目:输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的数字中最小的一个。例如输入的数组{3,32,321},则打印出这3个数字能排成的最小数字321323.这道题其实是希望我们能找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。要确定排序规则,就要比较两个数字,也就是给出两个数字m和n,我们需要确定一个规则判断m和n哪一个应该排在前面,而不是仅仅比较这个数原创 2015-05-12 19:05:49 · 473 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题34:丑数
题目:我们把只包含因子2,3和5的数称作丑数。求按从小到大的顺序的定义1500个丑数。例如6,8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数。逐个判断每个整数是不是丑数的解法,直观但不够高效所谓一个数m是另一个数n的因子,是指n能被m整除,也就是说n%m == 0.根据丑数的定义,丑数只能被2,3和5整除,也就是说一个数能被2整除,我们把它连续除以2;如果能被3整除原创 2015-05-12 19:47:42 · 421 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题19:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BianryTreeNode* m_pLeft; BianryTreeNode* m_pRight;};树的镜像对很多人来说是一个新的概念,我们未必能够一下子想出求解树的镜像的方法。为了能够形成直观的印象,我们可原创 2015-05-08 18:05:11 · 322 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题18:树的子结构
题目:输入两颗二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};要查找树A中是否存在和树B结构一样的子树,我们可以分成两步:第一步在树A中找到和B的根结点的值一样的结点R,第二步原创 2015-05-08 15:35:49 · 325 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。在实际的软件开发周期中,设计的时间通常不会比编码的时间短。在面试的时候我们不要急于动手写代码,而是一开始仔细原创 2015-05-08 13:24:25 · 317 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题48:不能被继承的类
题目:用C++设计一个不能被继承的类在c#中定义了关键字sealed,被sealed修饰的类不能被继承。在Java中同样也有关键字final表示一个类型不能被继承。在C++中没有类似于sealed和final的关键字,我们只有自己来实现。常规的解法:把构造函数设为私有函数很多人都能够想到,在C++中子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。要想一原创 2015-05-15 10:46:11 · 438 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题49:把字符串转换成整数
题目:实现一个函数StrToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串"",正负号,溢出等方方面面的测试用例都考虑到,并且在写原创 2015-05-15 12:44:32 · 470 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题50:树中两个结点的最低公共祖先
题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针。bool GetNodePath(TreeNode* pRoot, TreeNode* pNode, list&path){ if(pRoot == pNode) return true; path.push_back(pRoot); bool found = false; vector::iter原创 2015-05-15 14:35:58 · 414 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题51:数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字时间很容易的事情,只需要从头到尾扫描排序后的数组就原创 2015-05-15 15:01:06 · 544 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题52:构建乘积数组
题目:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[I-1]*A[I+1]*...*A[n-1]。不能使用除法。void multiply(const vector& array1, vector& array){ int length1 = array1.size(); int length原创 2015-05-15 15:33:21 · 475 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题55:字符流中第一个不重复的字符
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符“go”时,第一个只出现一次的字符是‘g’。当从该字符流中读出前六个字符“google”时,第一个只出现1次的字符是"l"。字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数据容器里。当这个字符再次从字原创 2015-05-17 12:35:31 · 459 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题62:序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。通过分析解决前面的面试题6.我们知道可以从前序遍历和中序遍历构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序序列,然后再反序列化时通过这两个序列重构出原二叉树。这个思路有两个缺点。一个缺点是该方法要求二叉树中不能用有数值重复的结点。另外只有当两个序列中所有数据都读出后才能开始反序列化。如果两个遍历序列原创 2015-05-17 15:20:18 · 476 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题11:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。我们都知道在C语言的库中有一个pow函数可以用来求乘方,本题要求实现类似于pow的功能。要求实现特定库函数(特别是处理数值和字符串的函数)的功能,是一类常见的面试题。自以为题目简单的解法由于不需要考虑大数问题,这道题看起原创 2015-05-07 13:04:29 · 287 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题12:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的n位十进制数。比如输入3,则打印出1,、2、3一直到最大的3位数及999.跳进面试官的陷阱这个题目看起来很简单。我们看到这个问题之后,最容易想到的办法是先求出最大的n位数,然后用一个循环从1开始逐个打印。于是我们很容易就能写出如下的代码:void Print1ToMaxOfDigits(int n){ int number = 1; int原创 2015-05-07 15:11:42 · 584 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题13:在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};void DeleteNode(ListNode **pListHead, ListNode *pToBeDeleted);在单向链表中删除一个结点,最常规的做法原创 2015-05-08 10:25:52 · 294 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};这是一个经常被各公司采用的面试题。在面试过程中,我们发现应聘者最容易犯两种错误:一是在写代码之前没有对合并的过程想清楚,最终合并出来的链表要么中间断开了,要么并没有做到原创 2015-05-08 15:10:30 · 369 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题21:包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。看到这个问题,我们第一个反应可能是每次压入一个新元素进栈,将栈里的所有元素排序,让最小的元素位于栈顶,这样就能在O(1)的时间得到最小元素。但这种思路不能保证最后压入栈的元素能够先出栈,因此这个数据结构已经不是栈了。我们接着想到在栈里添加一个成员变量原创 2015-05-10 13:50:52 · 281 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题9:斐波那契数列
题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列数列的定义如下:公式f[n]=f[n-1]+f[n-2],且f[1]=1,f[2]=1。效率很低的递归算法,面试官都不会喜欢long long Fibonacci(unsigned int n){ if(n <= 0){ return 0; } if(n == 1){ return原创 2015-05-06 17:05:11 · 311 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。如果不考虑时间复杂度,最简单的思路应该是从头到尾扫描这个数组,没碰到一个偶数时,拿出这个数字,并把这个数字后面的所有数字往前移动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于碰到一个偶数就需要移动O(n)个数字,因此总的时间复杂度是O(n^2)。但是,原创 2015-05-08 11:04:36 · 378 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题15:链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头开始它们的值依次是1、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。链表结点定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};为了实现只遍历链表一次就能够原创 2015-05-08 12:23:25 · 326 阅读 · 0 评论 -
《剑指Offer》学习笔记--面试题35:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。由于这道题目与字符出现的次数相关,我们是不是可以统计每个字符在该字符串中出现的次数?要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数。在这个数据容器中可以根据字符来查找它出现的次数,也就是说这个容器的作用是把一个字符映射成一个数字。在常用的数据容器中,哈希表正是这个用途。为了解决这个问题,我原创 2015-05-13 13:03:22 · 640 阅读 · 1 评论 -
《剑指Offer》学习笔记--面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。看到这个题目,我们的第一个反应是顺序扫描整个数组。每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就原创 2015-05-13 14:13:14 · 392 阅读 · 0 评论 -
华为2016校招机试题
题目一:根据指定的分隔符分隔字符串,并输出指定的段描述根据指定的分隔符分隔字符串,并输出指定的段。如果指定的段超过分隔的段数,输出:NULL举例: AAA?BBB?CCC??2 字符串为:AAA?BBB?CCC? 分隔符为:? 指定的段为:2 字符串分割为:AAA BBB CCC共三段,第2段字符串为:BBB输入输出格式要求输入分隔字符串长度小于128个字符原创 2015-09-05 23:02:22 · 2498 阅读 · 2 评论 -
2015届华为校园招聘机试题及参考答案
第一题(60分): 按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”。#include using namespace std;void decomposition(char* str,原创 2015-09-06 10:22:07 · 902 阅读 · 0 评论 -
2014届华为上机题目及参考答案
一、题目描述(60分):通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。要求实现函数:void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr);【原创 2015-09-06 11:49:42 · 769 阅读 · 0 评论 -
operator new 函数、operator delete 函数 和 定位 new
我们知道在C++中申请内存空间和释放内存空间是用new和delete来完成,我们先来看new表达式:string *sp = new new string("initialized");实际上发生了三个步骤:(1)首先,该表达式调用名为operator new的标准库函数,分配足够大的原始的未类型化的内存,以保存指定类型的一个对象;(2)接下来,运行该类型的一个构造函数,用指定初始化式原创 2015-09-09 21:25:57 · 729 阅读 · 0 评论