随笔分类 - 剑指offer
摘要:【面试题050】树中两个结点的最低公共祖先题目: 树中两个节点的最低公共祖先。思路一: 输入两个树节点,求他们的最低公共祖先,——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的。二叉搜索树都是排序过的,位于左子树的节点都比父节点小,而位于右子树上面的节点都比父节点大。如果当前节点的值比...
阅读全文
摘要:【面试题049】把字符串转换成整数题目: 用C++定义一个不可以被继承的类。思路一: 正整数的最大值是0x7FFF FFFF,最小的负整数是0x8000 0000,因此我们需要分两种情况来分别判断整数是否发生上溢出和下溢出。123456789101112131415161718192021222...
阅读全文
摘要:【面试题048】不能继承的类题目: 用C++定义一个不可以被继承的类。思路一: 把构造函数设为私有的函数。1234567891011121314151617181920212223242526272829303132#includeusingnamespacestd;classSealedCla...
阅读全文
摘要:【面试题047】不用加减乘除做加法题目: 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、* 、/四则运算符号。思路一: 用二进制,位移运算来模拟加法运算。123456789101112131415161718192021222324#includeusingnamespacestd;...
阅读全文
摘要:【面试题046】求1+2+...+n题目: 求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路一: 利用构造函数求解。1234567891011121314151617181920212223242526...
阅读全文
摘要:【面试题045】圆圈中最后剩下的数字题目: 0, 1, ... , n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路一: 用环形链表来模拟这个圆圈。 std::list,并不是一个环形链表,因此扫描到链表末尾的时候,我们要记得把迭代...
阅读全文
摘要:【面试题044】扑克牌的顺子题目: 从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意的数字。思路一: 可以吧五张牌看成是五个数字组成的数字,大小王是特殊的数字,把他填为0(为了和其他牌区分),对数组...
阅读全文
摘要:【面试题043】n个骰子的点数题目: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为s,输入n,打印出s的所有可能的值出现的概率。n个骰子的总点数,最小为n,最大为6n,根据排列组合的知识,那个骰子,所有点数的排列数为6^n。我们先统计每一个点数出现的次数,然后把每一个点数出现的次数除以6^n,...
阅读全文
摘要:【面试题042】翻转单词顺序VS左旋转字符串题目一: 输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。 例如输入字符串“I am a student.”,则输出“student. a am I”。思路一: 反转字符串的顺序,这样子每个单词...
阅读全文
摘要:【面试题041】和为s的两个数字VS和为s的连续正数序列题目一: 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。思路一: 现在数组中固定一个数字,再依次判断数组中其他的n-1个数字与它的和是不是等于s,——时间复杂度O(...
阅读全文
摘要:【面试题040】数组中只出现一次的数字题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路一: 考虑,只有一个元素出现一次的情况,任何一个数字异或自己都得0,也就是说我们从头到位异或每个元素,那么...
阅读全文
摘要:【面试题039】二叉树的深度题目一: 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度。二叉树结点的结构如下:123456structBinaryTreeNode{intm_nValue;BinaryTreeNode*m...
阅读全文
摘要:【面试题038】数字在排序数组中出现的次数题目: 统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路一: 利用二分查找法,找到这个数字,然后在奇拿后遍历得到这个数字的个数。——时间复杂度是O...
阅读全文
摘要:【面试题037】两个链表的第一个公共结点题目: 输入两个链表,找出它们的第一个公共结点。链表结点定义如下:12345structListNode{intm_nKey;ListNode*m_pNext;}思路一: 蛮力法,在第一个链表上面遍历,对每个遍历到的结点,我们都在第二个链表上面顺序遍历。如...
阅读全文
摘要:【面试题036】数组中的逆序对题目: 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。 输入一个数组,求出这个数组中的逆序对的总数。思路一: 遍历扫描整个数组,没扫描到一个数字的时候,逐个比较这个数字和它后面的数字的大小。 如果后面的数字比它小,则这两个数字就组...
阅读全文
摘要:【面试题035】第一个只出现一次的字符题目: 在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’。思路一: 从头遍历字符串,每遍历一个字符就和后面的字符做比较,如果没有发现后面出现相同的字符,那么这个时候还挺复杂的,例如上面的字符串,第一个a发现后面有a,但是第二个...
阅读全文
摘要:【面试题034】丑数题目: 我们把只包含因子2、3和5的数称为丑数(Ugly Number)。 求按从小到大的顺序的第1500个丑数。 例如6、8都是丑数,但14不是,因为他包含因子7。习惯上我们把1当做第一个丑数。思路一: 逐个的判断,效率不高。1234567891011121314151...
阅读全文
摘要:【面试题033】把数组排成最小的数题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数, 打印能拼接出的所有数字中最小的一个。 例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。思路一: 最直观的想法是求出所有数字的全排列,然后取最小值即可, ...
阅读全文
摘要:【面试题032】从1到n整数中1出现的次数题目: 输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。 例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1出现了5次。思路一: 对每一个数字做判断,把1出现的数字累加。 可以通过对10取余,判断这个数字个位上的...
阅读全文
摘要:【面试题031】连续子数组的最大和题目: 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。要求时间复杂度为O(n)。思路一: 枚举出数组的所有子数组并求出他们的和,最快也需要O(n^2)的时间,思路二: 举例分析数组的规律,如果加...
阅读全文

浙公网安备 33010602011771号