- 博客(61)
- 收藏
- 关注
原创 两颗球测楼高s
16年还没毕业的时候就傻傻的去面试一个十份注重算法的公司,当时一道题目,我甚至连题都没看懂,傻傻想二分。题目如下: 有一栋100层高的大楼,给你两个完全相同的玻璃球,假设从某一层开始丢下玻璃球会摔碎,怎么利用手中的两个玻璃球,用什么最优策略(最少次数)知道这个临界的层是第几层。思路:球烂了就不能再用,所以二分是不存在的。如果只给我1个球,那么我别无选择,从1楼暴力到100楼,那么10...
2018-03-11 23:49:55 545
原创 3/1日面试反思
今天去面试一家,9点出门,预计90分钟能到,没看仔细,坐错车,还好是预留两小时,还能抢救一下,最后结果迟到10分钟,所幸面试官没因此直接叫我滚。带着这种心情,开始了第一轮的机试,一看两道题,一道以ui方式写个计时器,一道是斗地主发牌。ui计时器就花了了大半小时,主要是TimeSpan的格式化没找到格式成不要最后小数位的,花了大半时间。模拟发牌的,也是石乐志,老纠结于13张和4种花色如何比较大小,用...
2018-03-01 16:20:15 263
原创 面试题:不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用四则运算符号。思路:位运算咯。int Add(int num1,int num2){ int sum,carry;do{ sum=num1^num2;carry=(num1&num2)num1=sum;num2=carry;}while(num2!=0);return num1;}
2018-02-04 23:34:51 265
原创 面试题:股票的最大利润
假设吧某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路:如果在扫描到数组中的第i个数字时,只要我们能够记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。int Max
2018-02-04 23:27:06 3445
原创 面试题:圆圈中最后剩下的数字
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路:经典问题,约瑟夫(Josephuse)环找到递归公式,则容易写下这代码:int LastRemaining(unsigned int n,unsigned int m){ if(n return -1; int last=0;
2018-02-04 12:04:04 304
原创 面试题:扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:如果一副牌里含有对子,则不可能是顺子。bool IsContinuous(int* numbers,int length){ if(numbers==nullptr||length return false; qs
2018-02-04 11:57:12 369
原创 面试题:n个骰子的点数
把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。思路:两个数组,第一个存储可能出现的结果,第二个根据第一个求和。void PrintProbability(int number){ if(number return; int* pProbabilities[2]; pProbabilities[0]=new in
2018-02-04 03:04:08 313
原创 面试题:队列的最大值
滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。很有想法的解决方案:vector maxInWindows(const vector& num,unsigned int size){ vector maxI
2018-02-04 02:51:06 241
原创 面试题:翻转字符串
翻转单词顺序。输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.”,则输出“student. a am I"。思路:单词翻转,整个句子翻转。void Reverse(char *pBegin,char *pEnd){ if(pBegin==nullptr||pEnd==nullp
2018-02-04 02:27:53 217
原创 面试题:和为s的连续正数序列
输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如,输入15,由于1+2+3+4+5=4+5+6+7+8=15,所以打印出3个连续序列1~5、4~6和7~8。思路:依旧双指针套路void FindContinuousSequence(int sum){ if(sum return ; int small=1;int big=2;int
2018-02-04 02:12:06 184
原创 面试题:和为s的数字h
和为s的两个数字。输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。代码思路清晰:bool FindNumbersWithSum(int data[],int length,int sum,int* num1,int* num2){ bool found=false;if(length ret
2018-02-04 01:59:22 237
原创 面试题:数组中唯一只出现一次的数字
在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路:我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。代码如下:int FindNumberAppearingOnce(int numbers[],int length){ if(numbers==
2018-02-04 01:50:52 4437 3
原创 面试题:数组中数字出现的次数
数组中只出现一次的两个数字。一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:要求也就是说,一次遍历,常量存储。而且这还不是一个已经排序的数组。提示:异或答案如下:void FindNumsAppearOnce(int data[] ,int length,int* num1,int*
2018-02-03 13:30:32 275
原创 面试题:平衡二叉树
输入一棵二叉树的跟节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路:还记得后序遍历么?bool IsBalanced(BinaryTreeNode* pRoot,int* pDepth){ if(pRoot==nullptr){ *pDepth=0;return true;}int le
2018-02-03 13:15:30 318
原创 面试题:二叉树的深度
输入一颗二叉树的跟节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。答案:int TreeDepth(BinaryTreeNode* pRoot){ if(pRoot==nullptr) return 0; int nLeft=TreeDepth(pRoot->m_pLeft);int nRight
2018-02-03 13:07:01 178
原创 面试题:数组中数值和下标相等的元素
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。思路:暴力法简单,O(n)的效率也可以接受,但直觉告诉我可以答案是O(logn),因为题目说了,单调递增。int GetNumberSameAsIndex(conmst int* numbers,int leng
2018-02-03 12:56:25 746
原创 面试题:0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不再该数组中,请找出这个数字。思路:可选有n个,长度为n-1,不重复还递增,那么第一个下标与值不等的就是结果咯。显然,还是二分的节奏。int GetMissingNumber(const int* numbers,int length){
2018-02-03 12:49:53 2080
原创 面试题:在排序数组中查找数字
数字在排序数组中出现的次数。统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路:先用二分法拿到第一个要求数字的位置。int GetFirstK(int* data,int length,int k,int start,int end){ if(start>end) return
2018-02-03 12:41:43 197
原创 面试题:两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。链表节点定义如下:struct ListNode{ int m_nKey;ListNode* m_pNext;};思路:先得到两个链表的长度,得到两个链表长度的差值,哪个链表长则多走差值步数,然后一起走,直至相撞。耗时O(n+m)。代码如下:ListNode* FindFirstCommonNode(ListNode *p
2018-02-03 12:24:03 244
原创 面试题:数组中的逆序对
在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如吗,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)和(5,4)。思路:作者给出的是基于归并排序的一种算法。那么必然比暴力的O(n^2)的好。代码如下:int InversePairs(int* data,in
2018-02-02 15:44:07 300
原创 面试题:第一个只出现一次的字符
字符串中第一个只出现一次的字符。在字符串中找到第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。思路:那么我们知道有一种神奇的算法是能够在O(1)时间内找到结果,没错,它就是牛逼的哈希表。那么看下C++下对这道题的实现:char FirstNotRepeatingChar(char* pString){ if(pString==nullptr)
2018-02-02 15:28:53 210
原创 面试题:丑数
我们把只包含因子2、3和5的数称为丑数(Ugly Number)。求按从大到小的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第1个丑数。思路:先来一个由定义得到的算法,再看看有没有优化空间。bool IsUgly(int number){ while(number%2==0) number/=2; while
2018-02-02 13:37:09 1332
原创 面试题:最长不含重复字符的子字符串
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4。思路:常规套路的话,先求有多少个子字符串,再看看是否有重复字符,那么一套下来就要O(n^3)。有点多,那么就用动态规划咯。参考代码如下:int longestSubstring
2018-02-02 12:21:41 610
原创 面试题:礼物的最大价值
在一个mxn的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一个,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?思路:显然这个问题是有子问题存在的,那么递归是肯定可以解决的,递推行不行呢?感觉也不行,顺着来的话就变成贪心算法了,它要的是绝对的最大值,那就优化递归,变成
2018-02-02 11:32:28 1303
原创 面试题:把数字翻译成字符串
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,1翻译成“b”,·······,25翻译成“z”。一个数字可能有多个翻译。例如,12258有5种不同的翻译,分别是“bccfi”、"bwfi"、"bczi"、"mcfi"和"mzi"。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:经过本书前面200多页的洗礼,对这道题的不再那么难接受了。目前这么想,把这数字拆成
2018-02-02 11:14:25 1569
原创 面试题:把数组排成最小的数
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接处的所有数字中最小的一个。例如,输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323。思路:暴力全排列基本属于不可考虑的情况,O(n!)。那么考虑两个数字拼成一个后再跟下一个拼,那么也能得到最小数字,这样子就能得到O(nlogn),好太多了这效率。还要注意一点,假如数组有点大,那么一个Int是收不完的,最
2018-02-02 10:45:36 163
原创 面试题:数字序列中某一位的数字
数字以0123456789101112131415····的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路:利用进位缩小范围。int digitAtIndex(int index){ if(index return -1; int digts=1; whi
2018-02-01 16:18:34 934
原创 面试题:1~n整数中1出现的次数
输入一个整数,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。思路:这又是一道时间优化题。答案如下:int NumberOf1Between1AndN(int n){ if(n return 0; char strN[50];sprintf(strN,"%d",
2018-02-01 16:05:16 167
原创 面试题:连续子数组的最大和
输入一个整型数组,数组里有正数也有负数。数组中的一个或多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路:之前不知道在哪看过这题目,不过这题目是求股票买入卖出的解决方案,还有是股票那题是求该最大子数组在哪,有点不一样。再分析一下时间复杂度要求竟然为O(n),那么说明就只是一次遍历就完了。bool g_InvalidInput=false;int F
2018-02-01 15:52:05 182
原创 面试题:最小的k个数
输入n个整数,找出其中最小的k个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。思路:O(nlogn)排序,然后输出。额,肯定速度上还有更高的要求。跟求中位数一样花O(n)的时间一样,这个等于求第k小的进行左小右大操作。那么代码如下:void GetLeastNumbers(int* input,int n,int* output,int k)
2018-02-01 14:24:24 139
原创 面试题:数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如,输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。思路:如果这个数组是排序的话,那么数组中间的那个数字就是答案,此时效率O(nlogn)。显然,不可能那么简单。我们现在要得到的就转换为求数组中位数,那么依据快排的思想,取一个数字,大于它的放右边,
2018-02-01 13:59:19 268
原创 面试题:字符串的排序
输入一个字符串,打印出该字符串中字符的所有序列。例如,输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。void Permutation(char* pStr){ if(pStr==nullptr) return; Permutation(pStr,pStr);}void Permutation
2018-01-31 22:21:14 278
原创 面试题:二叉搜索树与双向链表
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树种节点指针的指向。节点定义如下:struct BinaryTreeNode{ int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};思路:二叉搜索树的中序遍历是刚好排序的!!!!!Binar
2018-01-31 22:10:18 131
原创 面试题:二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中节点值和为输入整数的所有路径。从数的根节点开始从下一直到叶节点所经过的节点形成一条路径。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};答案:void FindPath(
2018-01-31 21:09:54 174
原创 面试题:二叉搜索树的后续遍历序列
输入一个整数数据,判断该数组是不是某二叉搜索树的后续遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。关于树的遍历问题相对解法比较单一,固定套路。bool VerifySequenceOfBST(int sequence[] ,int length){ if(sequence==nullptr||length return
2018-01-31 20:52:07 210
原创 面试题:从上到下打印二叉树
不分行从上到下打印二叉树思路:层级打印void PrintFromTopToBottom(BinaryTreeNode* pTreeRoot){ if(!pTreeRoot) return;std::deque dequeTreeNode;dequeTreeNode.push_back(pTreeRoot);while(dequeTreeN
2018-01-30 21:52:18 227
原创 面试题:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。思路:显然需要辅助空间,那么来多一个栈吧。把压栈序列压入栈,看弹出的时候能否匹配弹出序列。题目假设了所有数字不
2018-01-30 21:43:43 181
原创 面试题:包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。思路:push 和pop肯定都是符合要求的,那么min该怎么办呢?常数时间,那么就必须空间换时间了。那么就来一个辅助栈吧,如果栈元素也有序号的话,那么就是说在主栈的序号对应辅助栈的序号。代码如下: template void Stac
2018-01-30 19:02:56 186
原创 面试题:顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。先上答案,再分析:void PrintMatrixClockwisely(int** numbers,int columns,int rows){ if(numbers==nullptr||columns return; int start=0; while(columns>start *2&&
2018-01-30 18:11:18 166
原创 面试题:对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么它是对称的。思路:三种二叉树的遍历算法,即前、中、后序遍历方式,都是先左后右的操作。想到这里一看人家的答案,算了,我还是抄上来吧。bool isSymmetrical(BinaryTreeNode* pRoot){ return isSymmetrical(pRoot,pRoot);}
2018-01-30 16:22:58 202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人