
面试题
ChaseRaod
这个作者很懒,什么都没留下…
展开
-
C语言实现无头单链表及链表相关面试题(重点!)
链表通常是面试中的重点,本文是用C语言写一个无头单链表,并介绍它的相关面试题的解法。 其中涉及到的面试题如下: 1. 比较顺序表和链表的优缺点,说说它们分别在什么场景下使用? 顺序表:内存中地址连续 长度不可变更 支持随机查找 可以在O(1)内查找元素 适用于需要大量访问元素的 而少量增添/删除元素的程原创 2017-06-17 23:45:04 · 973 阅读 · 0 评论 -
二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶子节点所经过的节点形成一条路径。 比如上面这棵二叉树中,和为22的路径有两条:一条是10、12,另一条路径是10、5、7.分析题意后,可以看出,路径都是从根节点开始打印,所以我们需要前序遍历这棵二叉树,且当我们遍历下一个节点的时候,必须知道在它之前遍历过哪些节点,并将这些节点的值保存起来。当我们原创 2017-11-15 20:12:12 · 462 阅读 · 0 评论 -
最小的K个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1。6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。这道题类似于之前讲堆的那篇文章中,求公司员工喜欢的前K种水果,那道题我们可以使用最小堆解决,同样的思路,这道题我们可以使用最大堆解决,在最大堆中,根节点的值总是大于它的子树中任意节点的值。所以我们可以在O(1)时间内得到已有的K个数中的最大值,但需要O(logk)时间完成删除原创 2017-11-16 17:24:01 · 304 阅读 · 0 评论 -
之字形打印二叉树
将一棵二叉树按“之”字型打印是什么意思呢?如下图所示的二叉树,遍历之后打印结果如右图,即为二叉树的之字型打印。 分析题意:当打印奇数行时,按照从左到右的顺序打印,当打印偶数行时,要按照从右往左相反的方向打印,这样的结构很自然想到用栈来实现,但我们需要创建两个栈,来区分偶数行和奇数行的情况。当为奇数行时,需要从右到左入栈,从左到右出栈,偶数行相反。 代码实现://之字形遍历 void原创 2017-12-04 09:45:21 · 1490 阅读 · 0 评论 -
第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“absccdeff”,则输出b.由于题目与字符出现的次数有关,我们需要统计每个字符出现的次数,要达到这个目的,我们需要一个数据容器来存放每个字符的出现次数,在这个数据容器中可以根据字符来查找它出现的赐福,也就是说这个容器的作用是把一个字符映射成一个数字。由此我们可以想到用哈希表。同时,我们还需要从头开始扫描字符串两。第一次扫描字符串时,每原创 2018-01-05 20:26:12 · 691 阅读 · 1 评论 -
数组中只出现一次的数字
题目:一个整型数组里除了两个数字以外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(N),空间复杂度是O(1)。例如,在数组{2,4,3,6,3,2,5,5}中,只有4,6出现了一次,其他数字都是成对出现。所以结果应该是4和6。分析题意,在学C语言的时候我们做过一道题,一个数组中只有一个数字出现了一次,其他数字都是成对出现。这道题我们很容易想到用抑或的性质原创 2018-01-05 21:14:35 · 323 阅读 · 0 评论 -
翻转字符串 VS 左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出”student. a am I”。第一步:翻转句子中的所有字符,比如翻转”I am a student.”中的所有字符得到”.tneduts a ma I”,此时不但翻转了句子中单词的顺序,每个单词内的字符也被翻转了。第二步,原创 2018-01-17 01:27:32 · 462 阅读 · 0 评论 -
从第一个字符串中删除在第二个字符串中出现过的所有字符
题目:定义一个函数,从第一个字符串中删除在第二个字符串中出现过的所有字符。例如,从第一个字符串”We are students.”中删除在第二个字符串”aeiou”中出现过的字符得到的结果是“W r stdnts.”。 我们可以利用一个哈希表将第二个字符串中出现的所有字符映射进去,这样就可以在O(1)的时间内判断出第一个字符串中的字符是否出现在第二个字符串中,同时可以在O(N)的时间内删除第二个原创 2018-01-08 16:06:37 · 1628 阅读 · 0 评论 -
和为S的两个数字 VS 和为S的连续整数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。我们以数组{1、2、4、7、11、15}以及和为15举例。首先定义两个指针,一个指向数组的第一个数字1,第二个指针指向数组的最后一个数字15,他们相加的和为16,大于15,因此我们将第二个指针向前移动一个数字,让它指向11,此时两个数字之和为12,小于15,我们再将原创 2018-01-17 14:36:30 · 432 阅读 · 0 评论 -
删除字符串中重复出现的数字
题目:定义一个函数,删除字符串中所有重复出现的字符。例如输入“google”,删除重复字符之后的结果是”gole”. 这道题和前两篇博客中的题解法类似,都是运用哈希表的性质 第一个只出现一次的字符 从第一个字符串中删除第二个字符串中出现的所有字符 同样的思想,把字符串中的字符都映射到哈希表中,出现一次即次数+1,那么我们就只需让次数为1的字符在原字符串中即可。char* DelRe原创 2018-01-08 16:40:08 · 1682 阅读 · 0 评论 -
判断两个单词是否互为变位词
题目:在英语中,如果两个单词中出现的字母相同,并且每个字符出现的次数也相同,那么这两个单词互为变位词(Anagram).例如slient与listen、evil与live等互为变位词。请完成一个函数,判断输入的两个字符串是不是互为变位词。 同样,和前面几篇博客中的思路大致相同,我们可以用一个哈希表映射第一个字符串中的每个字符,统计字符串中每个字符出现的次数,当扫描到第一个字符串中出现的每个字符时原创 2018-01-08 17:50:20 · 3467 阅读 · 0 评论 -
不能被继承的类
题目:用C++设计一个不能被继承的类。在C++中,子类的构造函数会自动调用父类的构造函数,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从它那里继承的时候,必然会由于调用构造函数、析构函数而导致编译错误。同时,我们可以通过定义公有的静态函数来创造和释放类的实例。class SealedClass{pub原创 2018-01-17 20:17:16 · 455 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。看到题目的第一感觉我们肯定想到的是遍历整个数组来求解,但这样的算法时间复杂度是O(N),还不是最优解,我们可以想到使用二分查找来优化。由于数组是排好序的,假设我们是统计数字K在排序数组中出现的次数,所以我们可以用二分查找直接找到数组中的第一个K和最后一个K。原创 2018-01-09 23:55:18 · 530 阅读 · 0 评论 -
leetcode
本文用来记录自己做leetcode的解题思路,可能不是最优解法.1,Given an array of integers, return indices of the two numbers such that they add up to a specific target.You may assume that each input would have exactly one sol原创 2018-01-03 17:51:46 · 607 阅读 · 0 评论 -
关于数组的笔试、面试题
以下题目出自leetcode. 我们先来回顾一下最基础的二分查找算法。class Solution1{public: int Search(int A[], int n, int target) { int frist = 0, last = n; while (frist != last) { co...原创 2018-05-01 21:47:41 · 2476 阅读 · 2 评论 -
关于链表的笔试、面试题
以下题目来源于leetcode有两个链表,它们表示逆序的两个非负数。计算出两个数的和之后,同样逆序输出作为一个链表 比如:(2->1->3)+ (5->6->4) 得到:7->0->8//Add two Numbersclass Solution{public: ListNode *AddTwoNumbers(ListNode* l1, ListNode* l2)原创 2018-05-04 11:58:27 · 633 阅读 · 0 评论 -
关于字符串的笔试、面试题
1,验证一个字符串是否是回文串。 需要一个指向头部的变量和指向尾部的变量,从字符串的两边来遍历,遇到除字母和数字以外的字符则跳过,如果遍历完整个字符串后前后字母都能匹配上,则是回稳返回true.注意:空串也是回文。需要注意的几点:(1)、对大小写不敏感,需要把所有字母小写都转换成大写,或者大写都转换成小写,用toupper()函数。 (2)、遇到非字母、数字要跳过,用到isalnum()...原创 2018-05-05 22:11:32 · 3442 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false.假设输入的数组任意两个数字都不相同。 首先,我们知道,二叉搜索树的特点是:左子树的所有节点都小于根节点,右子树的节点都大于根节点。题目所说的是后序遍历这棵二叉树,我们便可以得出结论:数组的最后一个数字一定是这棵二叉搜索树的根节点,它前面的数组元素又可以分为两个区间,比根节点小的是左子原创 2017-11-13 20:06:17 · 339 阅读 · 0 评论 -
连续数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个数组组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(N)比如,我们给出数组:arr[] = {2,-1,3,-5,-3,5,6,1},第一步加上数字2,此时和为2。接着,2+(-1),和变成1,因为第二个元素是负数,加上它之后,当前的和比上一个元素还要小,所以应该保存上一次的结果,它可能是最大值。1+(3) = 4,此原创 2017-11-17 16:11:32 · 419 阅读 · 0 评论 -
栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序。请判断第二个序列是否为栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 这道题的规律如下:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出,如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助原创 2017-11-13 11:54:19 · 428 阅读 · 0 评论 -
C语言模拟实现C++的继承多态
C++的三大特性:封装、继承、多态,这些是C语言没有的,C++用class类实现了这三个特性,而C语言只有struct结构体,那么,如何用C语言模拟实现C++的继承和多态呢?我们先要清楚继承和多态的概念。继承:允许派生类在基类原有特性的基础上扩展,增加派生类特有成员。多态:通过虚函数指针指向虚表中不同类中的同名函数。#define _CRT_SECURE_NO_WARNINGS 1#include原创 2017-07-29 16:08:52 · 456 阅读 · 0 评论 -
C++:堆和栈的概念及区别
一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似转载 2017-07-01 23:21:09 · 3829 阅读 · 0 评论 -
【面试题】C++综合面试题
1,简述C++虚函数作用及底层实现原理虚函数的作用是使基类指针指向派生类对象时,访问派生类的同名函数,实现动态联编。 原理:每个含有虚函数的派生类对象都有一个或多个(多继承)虚函数表指针,虚函数表指针指向了一个虚函数表,如果该类重写了基类的虚函数,则存放派生类的虚函数地址,如果没有重写,则存放基类的虚函数地址。2,一个对象访问普通函数和虚函数哪个更快?答案是不一定。这就要看这个函数是否构成多态了,原创 2017-07-17 01:02:16 · 594 阅读 · 0 评论 -
【面试题】判断一棵二叉树是否是完全二叉树
判断一棵树是否是完全二叉树,这道题是层序遍历二叉树的升级版,其实运用的知识就是层序遍历。我们先来回顾一下如何层序遍历一棵二叉树二叉树的结构:template<class T>struct BinaryTreeNode{ T _data; BinaryTreeNode<T>* _left; BinaryTreeNode<T>* _right; BinaryTreeNo原创 2017-07-27 23:48:04 · 922 阅读 · 0 评论 -
求一个无序数组的中位数
求一个无序数组的中位数。 如:{2,5,4,9,3,6,8,7,1}的中位数为5,{2,5,4,9,3,6,8,7,1,0}的中位数为4和5。 要求:不能使用排序,时间复杂度尽可能高。 这道题我们给出两种解法。一,优先级队列基本思想: 1、将前(n+1)/2个元素调整为一个小顶堆 2、对后续的每一个元素,和堆顶比较,如果小于等于堆顶,丢弃之,取下一个元素。如果大于堆顶,用该元素取代堆顶,调整堆原创 2017-08-07 00:01:40 · 1329 阅读 · 0 评论 -
牛客刷题:笔试常考题和易错题(长期更新)
1,C++中为什么用模板类的原因?(即模板类的优点) (1)可用来创建动态增长和减小的数据结构 (2)它是与类型无关的,因此具有很高的可复用性 (3)它在编译时而不是在运行时检查数据类型,保证了类型安全 (4)它是与平台无关的,有很强的可移植性 (5)可用于基本数据类型2,以下程序的输出结果是什么?int main(){ int a = 1, b = 2, c = 3, d =原创 2017-05-22 17:38:17 · 784 阅读 · 0 评论 -
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串
给定一个字符串A,同时给定它的长度n及参数字符数组arg,请返回替换后的字符串。保证参数个数大数等于占位符的个数。保证原串由大小写字母组成,同时长度小于等于500。 测试样例:“A%sC%sE” ,7,['B','D','F'],3返回“ABCDEF”#include<vector>#include<assert.h>#include<string>//n是原串的长度,m是要替换的字符的数量原创 2017-09-23 14:42:44 · 1673 阅读 · 0 评论 -
根据Unix时间戳计算时间
根据Unix时间戳计算时间,不分大小月,每月30天,每年按360天计算。开始时间1970/01/01 00:00:00,输入秒数,显示时间输入:10 返回:1970/01/01 00:00:10 输入:12345678 返回:1970/05/23 21:21:18string CalculationDate(long long second){ int year = 1970, mon原创 2017-09-23 15:24:08 · 2342 阅读 · 0 评论 -
栈和队列相关面试题
1,用两个栈实现一个队列templateclass CQuee{public: CQuee() {} ~CQuee() {} void Push(const T& node); T Pop();private: stack stack1; stack stack2;};templatevoid CQuee::Push(const T& node){ st原创 2017-09-26 00:13:57 · 367 阅读 · 0 评论 -
C++函数重载机制及为什么要加extern C
C++程序调用被C编译后的程序为什么要加extern C? 因为C++和C是两种完全不同的编译链接处理方式,所以如果直接在C++里面调用C函数,这样链接起来是通不过的,会报链接错误,找不到函数体,所以要在 C++文件里面显示声明以下一些函数是C写的,要用C的方式来处理,这个在C++设计初期就考虑到兼容性的问题,所以是可以解决的。比如用C写了 A.h和A.c这两个文件,里面包括了void A_转载 2017-10-06 13:27:32 · 396 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1。 我们可以想到,这个旋转后的数组可以以看成两段有序区间。如上述题目中, 3,4,5是第一个递增区间,后面的1,2是第二个递增区间。并且,这个最小的数一定是两个递增区间的分界线。基于这原创 2017-11-08 13:55:53 · 457 阅读 · 0 评论 -
菲波那切数列的递归与非递归解法以及青蛙跳台阶问题
说到求菲波那切数列中的第n个数,大家首先想到的就是递归解法,简单易懂。long long Fibonacci(int n){ if (n <= 0) return 0; if (n == 1) return 1; return Fibonacci(n - 1) + Fibonacci(n - 2);}但每一次的递归都会是一次函数的调用,会原创 2017-11-08 16:01:06 · 741 阅读 · 0 评论 -
数值的整数次方
题目:实现函数double Power(double base,int exp),求base的exp次方。不得使用库函数,同时不需要考虑大数问题。 这道题本身难度不大,但有些细节需要注意。由于题目已经给出了返回值呵参数中的double型,所以在进行判0的时候,就不能再用if(base == 0)这样的处理,而要使用浮点数的判0处理。 再者,exp是整型,所以有可能是0或负数,这些都是需要特殊处理原创 2017-11-09 17:23:09 · 438 阅读 · 0 评论 -
面试官让你现场写一个string类,该写哪个版本的?
之前的 文章中,我们详细介绍过string类的深浅拷贝的实现以及引用计数,那么如果,在面试过程中你该给面试官展示哪一种string类呢? 今天我们就来写两个适合面试中写的string类1,深拷贝class MyString{public: MyString(char* str = "") :_str(new char[strlen(str) + 1]) {原创 2017-11-01 17:20:12 · 735 阅读 · 0 评论 -
打印1到最大的n位数
题目:输入数字n,按顺序打印出从1到最大的n位十进制数,比如输入数字3,则打印出1,2,3一直到最大的三位数999。这道题中,题目并没有说明n的范围,所以我们需要考虑到大数问题。我们通常用字符串或数组表达大数,字符串里的每个字符都是‘0’到‘9’之间的某一个字符,用来表示数字中的一位,因为数字最大是n位的,因此我们需要一个n+1的字符串(字符串中最后一个是结束字符’\0’)。当实际数字不够n位的时候原创 2017-11-10 09:27:16 · 338 阅读 · 0 评论 -
高效合并两个有序数组
之前有篇文章是将字符串中的空格替换成字符将字符串中的空格替换成相应的字符,在这篇文章中,我们使用的是从后往前调整数组的方法,时间复杂度为O(N).那么,在合并两条有序数组时,使用同样的思想比分别遍历两个数组要高效的多。题目: 有两个排序的数组A1和A2,内存在A1的末尾有足够多的空余空间容纳A2.请实现一个函数,把A2中的所有数字插入到A1中,且合并后所有的数字是已排序的。//合并两个有序数组#原创 2017-11-02 09:52:24 · 1675 阅读 · 0 评论 -
关于栈的笔试、面试题
1,判断给出的string中,括号是不是一一对应的,比如 ( ) 或者 { } [ ] ( )算合法的括号,(] 或者 ( [ ) ] 都不合法。用一个Stack来存储括号, 主要考察对栈数据结构的操作。 算法的时间复杂度是O(n),空间复杂度也是O(n)。 遍历传入的String s,如果遇到左括号就入栈;如果遇到右括号,检查栈如果为空,证明不能匹配,如果栈不空,pop出栈顶的元素,看是否与原创 2018-05-06 22:05:29 · 449 阅读 · 0 评论