
面试算法题
VanSODark
这个作者很懒,什么都没留下…
展开
-
面试题: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 · 325 阅读 · 0 评论 -
面试题:队列的最大值
滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{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 · 262 阅读 · 0 评论 -
面试题:翻转字符串
翻转单词顺序。输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“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 · 230 阅读 · 0 评论 -
面试题:和为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 · 195 阅读 · 0 评论 -
面试题:和为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 · 247 阅读 · 0 评论 -
面试题:数组中唯一只出现一次的数字
在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路:我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。代码如下:int FindNumberAppearingOnce(int numbers[],int length){ if(numbers==原创 2018-02-04 01:50:52 · 4578 阅读 · 3 评论 -
面试题:数组中数字出现的次数
数组中只出现一次的两个数字。一个整型数组里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路:要求也就是说,一次遍历,常量存储。而且这还不是一个已经排序的数组。提示:异或答案如下:void FindNumsAppearOnce(int data[] ,int length,int* num1,int*原创 2018-02-03 13:30:32 · 288 阅读 · 0 评论 -
面试题:平衡二叉树
输入一棵二叉树的跟节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路:还记得后序遍历么?bool IsBalanced(BinaryTreeNode* pRoot,int* pDepth){ if(pRoot==nullptr){ *pDepth=0;return true;}int le原创 2018-02-03 13:15:30 · 341 阅读 · 0 评论 -
面试题:二叉树的深度
输入一颗二叉树的跟节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。答案:int TreeDepth(BinaryTreeNode* pRoot){ if(pRoot==nullptr) return 0; int nLeft=TreeDepth(pRoot->m_pLeft);int nRight原创 2018-02-03 13:07:01 · 196 阅读 · 0 评论 -
面试题:数组中数值和下标相等的元素
假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。思路:暴力法简单,O(n)的效率也可以接受,但直觉告诉我可以答案是O(logn),因为题目说了,单调递增。int GetNumberSameAsIndex(conmst int* numbers,int leng原创 2018-02-03 12:56:25 · 761 阅读 · 0 评论 -
面试题: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 · 2102 阅读 · 0 评论 -
面试题:在排序数组中查找数字
数字在排序数组中出现的次数。统计一个数字在排序数组中出现的次数。例如,输入排序数组{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 · 212 阅读 · 0 评论 -
面试题:两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。链表节点定义如下:struct ListNode{ int m_nKey;ListNode* m_pNext;};思路:先得到两个链表的长度,得到两个链表长度的差值,哪个链表长则多走差值步数,然后一起走,直至相撞。耗时O(n+m)。代码如下:ListNode* FindFirstCommonNode(ListNode *p原创 2018-02-03 12:24:03 · 262 阅读 · 0 评论 -
面试题:扑克牌中的顺子
从扑克牌中随机抽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 · 385 阅读 · 0 评论 -
面试题:圆圈中最后剩下的数字
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 · 326 阅读 · 0 评论 -
面试题:对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。如果一颗二叉树和它的镜像一样,那么它是对称的。思路:三种二叉树的遍历算法,即前、中、后序遍历方式,都是先左后右的操作。想到这里一看人家的答案,算了,我还是抄上来吧。bool isSymmetrical(BinaryTreeNode* pRoot){ return isSymmetrical(pRoot,pRoot);}原创 2018-01-30 16:22:58 · 221 阅读 · 0 评论 -
面试题:二叉树的镜像
请完成一个函数,输入一颗二叉树,该函数输出它的镜像。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};思路:所谓镜像,即左右对称。那我们就要写一个方法,反转左右子树即可。void MirrorRecursively(Bi原创 2018-01-30 15:12:45 · 177 阅读 · 0 评论 -
面试题:树的子结构
输入两个二叉树A和B,判断B是不是A的子结构。二叉树节点定义如下:struct BinaryTreeNode{ double m_dbValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;}想法:遍历A,找到A的一个节点跟B的跟节点一样,有就继续往下对比,没有就换个节点,大致如此吧。代码如下:bool原创 2018-01-30 00:44:48 · 130 阅读 · 0 评论 -
面试题:合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。链表节点定义如下:struct ListNode{ int m_nValue;ListNode* m_pNext;}代码如下:ListNode* Merge(ListNode* pHead1,ListNode* pHead2){ if(pHead1==nullptr)原创 2018-01-30 00:11:24 · 185 阅读 · 0 评论 -
面试题:反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。链表节点定义如下:struct ListNode{ int m_nKey;ListNode* m_pNext;};思路:额,一路遍历下去,前后指向反过来,最后一个节点就输出。O(n)的效率也应该是最优的了。答案如下:ListNode* ReverseList(ListNode* pH原创 2018-01-29 23:44:39 · 305 阅读 · 0 评论 -
面试题:链表中环的入口节点
如果一个链表包含环,如何找出环的入口节点?思路:显然是借鉴了上一题的套路,双指针就是答案。分析一下这个题目,首先,要确定有个环,再确定入口。再确定有没有环的同时还能得到环的大小的话,入口节点就好办了。ListNode* MeetingNode(ListNode* pHead){ if(pHead=nullptr) return nullptr;ListNo原创 2018-01-29 22:59:44 · 173 阅读 · 0 评论 -
面试题:链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值一次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。链表定义如下:struct ListNode{ int m_nValue;ListrNode* m_pNext;};思路:双指针循原创 2018-01-29 21:42:32 · 202 阅读 · 0 评论 -
面试题:调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。想法:看到这要求就是把数组前后划分,是不是跟快排有相似之处,只不过快排依据是数值大小,而这个是奇偶。 static void DoSomethingToArray(int[] numbers, int length) {原创 2018-01-29 20:04:49 · 203 阅读 · 0 评论 -
删除链表的节点
在O(1)时间内删除链表节点。给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点与函数的定义如下:struct ListNode{ int m_nValue;ListNode* m_pNext;};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);思原创 2018-01-29 19:02:59 · 220 阅读 · 0 评论 -
面试题:不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用四则运算符号。思路:位运算咯。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 · 286 阅读 · 0 评论 -
面试题:股票的最大利润
假设吧某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的价格为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路:如果在扫描到数组中的第i个数字时,只要我们能够记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。int Max原创 2018-02-04 23:27:06 · 3490 阅读 · 0 评论 -
面试题:数值的整数次方
实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。思路,貌似挺简单,直接来咯。static double Power(double baseNum, int exponent) { if (Math.Equals(baseNum,原创 2018-01-28 20:26:15 · 164 阅读 · 0 评论 -
面试题:二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如,把9表示成二进制是1001,有2位是1。因此,如果输入9,则该函数输出2。思路:母语C#的我对位运算确实接触较少,看到这题想的都是先转二进制,然后遍历。private static int NumberOf1(int n) { int count = 0;原创 2018-01-28 19:53:09 · 317 阅读 · 0 评论 -
面试题:剪绳子
给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],```,k[m]。请问k[0]xk[1]x````xk[m]的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。思路:我没什么想法,作者给出了常规需要O(n^2)时间和O(n)空间的动态规划思路,接着用只需要O(1)时间和原创 2018-01-27 02:22:33 · 836 阅读 · 1 评论 -
面试题:机器人的运动范围
地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每次可以向左、右、上、下移动一个,但不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入放个(35,37),因为3+5+3+7=18。但它不能进入(35,38),因为3+5+3+8=19。请问该机器人能够到达多少个格子?思路:跟之前《矩阵中的路径》那题相似的背景。抽象化X,Y轴,可以拿一维原创 2018-01-26 14:45:43 · 451 阅读 · 0 评论 -
面试题:斐波那契数列
写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。斐波那契数列的定义如下:f(n)=f(n-1)+f(n-2) f(0)=0f(1)=1思路:教科书上演示递归的方法并不好,因为递归要从上至下到底后再反弹,要空间存储,费时又费力。说明递归方法不好的最好途径就是画树,一目了然,因为使用递归,出现了太多重复计算,而且因此还需占用大量空间。当n=100,递归就明显能原创 2018-01-24 20:40:02 · 459 阅读 · 0 评论 -
面试题:字符串的排序
输入一个字符串,打印出该字符串中字符的所有序列。例如,输入字符串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 · 292 阅读 · 0 评论 -
面试题:二叉搜索树与双向链表
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树种节点指针的指向。节点定义如下:struct BinaryTreeNode{ int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};思路:二叉搜索树的中序遍历是刚好排序的!!!!!Binar原创 2018-01-31 22:10:18 · 139 阅读 · 0 评论 -
面试题:二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中节点值和为输入整数的所有路径。从数的根节点开始从下一直到叶节点所经过的节点形成一条路径。二叉树节点定义如下:struct BinaryTreeNode{ int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;};答案:void FindPath(原创 2018-01-31 21:09:54 · 181 阅读 · 0 评论 -
面试题:二叉搜索树的后续遍历序列
输入一个整数数据,判断该数组是不是某二叉搜索树的后续遍历结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。关于树的遍历问题相对解法比较单一,固定套路。bool VerifySequenceOfBST(int sequence[] ,int length){ if(sequence==nullptr||length return原创 2018-01-31 20:52:07 · 223 阅读 · 0 评论 -
面试题:替换空格
请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入:“We are happy.”,则输出“We%20are%20happy."。这题的来由:在网络编程中,如果URL参数中含有特殊字符,如空格、‘#’等,则可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器可以识别的字符。转换的规则是在‘%’后面跟上ASCII吗的二位十六进制的表示。比如空格的ASCII码是3原创 2018-01-24 17:59:57 · 118 阅读 · 0 评论 -
面试题:二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:碰到二位数组,画图理解是非常直观的,所以解题第一步就是先画图理解。往右往下递增,很好画图。我的初步想法是搞对角线,看连续对角线数字的跟目标数字对比,一波对角循环把目标数字锁在2X2的4个数字中,有就返回,没就是false。后来写出原创 2018-01-24 00:59:35 · 199 阅读 · 0 评论 -
算法题:不修改数组找出重复的数字
在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个是重复的。请找出数组中任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3。思路:这道题跟 面试题:数组中重复的数字 基本一样,但是限制了不能修改输入数组,那么使用多一个辅助数组,对辅助数组进行之前的操作也是可行的,但是这道题肯定不原创 2018-01-23 23:56:32 · 1105 阅读 · 1 评论 -
面试题:从上到下打印二叉树
不分行从上到下打印二叉树思路:层级打印void PrintFromTopToBottom(BinaryTreeNode* pTreeRoot){ if(!pTreeRoot) return;std::deque dequeTreeNode;dequeTreeNode.push_back(pTreeRoot);while(dequeTreeN原创 2018-01-30 21:52:18 · 241 阅读 · 0 评论 -
面试题:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列{1,2,3,4,5}是某栈的压栈序列,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。思路:显然需要辅助空间,那么来多一个栈吧。把压栈序列压入栈,看弹出的时候能否匹配弹出序列。题目假设了所有数字不原创 2018-01-30 21:43:43 · 193 阅读 · 0 评论