经典面试题
zengwh513
学习图像处理,音频处理,机器学习
展开
-
【面试题】-数组A中任意两个相邻元素大小相差1,找出某个数在数组A中的位置。(所有位置 )
题目描述数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置。解题思路对于目标t,由当前位置a[index]比较开始,下一个可能位置为index = abs(t-a[index]),因为要找出所有的位置,所以找出第一个下标位置之后,再从这个下标的下一个开始重新查找。代码实现#include <stdio.h>#include <stdlib.h>#inclu原创 2015-05-13 16:21:21 · 2373 阅读 · 0 评论 -
【面试题】用栈实现队列
题目描述正如标题所述,你需要使用两个栈来实现队列的一些操作。队列应支持push(element),pop() 和 top(),其中pop是弹出队列中的第一个(最前面的)元素。pop和top方法都应该返回第一个元素的值。 http://www.lintcode.com/zh-cn/problem/implement-queue-by-two-stacks/代码实现class Queue {publ原创 2015-07-11 20:31:31 · 869 阅读 · 0 评论 -
内存泄漏检测
今天阿里内推电话面试,估计给跪了,其中问到一个问题就是,如何检测程序的内存泄漏问题。学生写的程序几乎比较小,没做过大型项目,所以内存泄漏问题一般情况下,肉眼都可以解决问题,直接看下哪块被malloc或new的内存,没有对应的free或delete掉。面试完,网上寻找了下答案,发现借助工具来检测非常方便而且精准。google搜索下关于这方面的资料,发现写得很不错,分享给大家,顺便标记下。强烈推荐第一篇原创 2015-07-13 20:10:21 · 753 阅读 · 0 评论 -
【面试题】删除链表中倒数第n个节点
问题描述给定一个链表,删除链表中倒数第n个节点,返回链表的头节点。样例 给出链表1->2->3->4->5->null和 n = 2.删除倒数第二个节点之后,这个链表将变成1->2->3->5->null.解题思路定义两个指针,刚开始分别指向头结点,然后先让一个指针先走n-1步,接着两个指针同时遍历链表,当第一个指针到达链表尾部的时候,第二个指针指向的就是要删除的倒数第n个结点。 编程需要注意的原创 2015-07-28 14:04:11 · 4844 阅读 · 0 评论 -
【面试题】在O(1)时间复杂度删除链表节点
题目描述给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾)。请在在O(1)时间复杂度删除该链表节点。并在删除该节点后,返回表头。样例 给定 1->2->3->4,和节点 3,返回 1->2->4。(372) Delete Node in the Middle of Singly Linked List http://www.lintcode.com/zh-cn/problem/dele原创 2015-07-28 15:01:17 · 4048 阅读 · 0 评论 -
验证二叉查找树
二叉查找树给定一个二叉树,判断它是否是合法的二叉查找树(BST)一棵BST定义为:节点的左子树中的值要严格小于该节点的值。 节点的右子树中的值要严格大于该节点的值。 左右子树也必须是二叉查找树。因为二叉查找树的中序遍历是有序的。所以验证是否为二叉查找树,用中序遍历这个二叉树,如果前一个结点的值大于当前结点的值,则证明这个不是二叉树。代码实现bool isValidBST(TreeNode *ro原创 2015-08-12 06:48:55 · 2035 阅读 · 0 评论 -
二分查找实现
二分查找二分查找的前提是数组必须有序。这个算法据某本说,百分之九十的都会写错。编写程序需要注意的是非法输入尽量使用迭代,因为如果数组很大的话,递归有可能是栈溢出循环判断条件注意mid的求值方法,mid = ((right - left) >> 1) + left ;可以防止两个整型值相加时溢出。并注意>>运算符优先级低于+ - * / %,所以要对左移右移加括号。如果没有加括号,得出的答案是原创 2015-07-30 21:00:22 · 1063 阅读 · 0 评论 -
翻转二叉树(递归与非递归)
翻转一棵二叉树样例 1 1 / \ / \2 3 => 3 2 / \ 4 4递归版本先翻转左子树,后翻转右子树,然后对整个树进行翻转void swapTree(TreeNode *&root){ TreeNode *tmp = root->left; root->left = root->right原创 2015-08-12 06:47:45 · 6373 阅读 · 0 评论 -
判断二叉树是否为平衡树
平衡二叉树给定一个二叉树,确定它是高度平衡的。对于这个问题,一棵高度平衡的二叉树的定义是:一棵二叉树中每个节点的两个子树的深度相差不会超过1。 先求左子树和右子树的最大深度,然后判断是否相差大于1,如果是,则不可能是,如果相差小于,继续递归调用判断左子树和右子树是否都是平衡二叉树。代码实现bool isBalanced(TreeNode *root) { // write your原创 2015-08-12 06:49:50 · 2277 阅读 · 0 评论 -
atoi代码实现
atoi函数atoi函数是实现数字字符串转整型数,实现代码的时候,要特别注意以下几点:前面有空格,调过要注意符号,即是正还是负数非法输入处理溢出代码实现int my_atoi(const char *str){ const char *s; char c; unsigned int cutoff; int acc; int neg, any, cu原创 2015-07-30 20:32:43 · 1473 阅读 · 0 评论 -
二叉树最大深度和最小深度
二叉树的最大深度给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的距离。如果二叉树为空,则深度为0 如果不为空,分别求左子树的深度和右子树的深度,去最大的再加1,因为根节点深度是1,要加进去。int maxDepth(TreeNode *root) { // write your code (here) if(root == NULL)原创 2015-08-12 06:50:45 · 13573 阅读 · 0 评论 -
动态规划(DP)之入门学习-数字三角形
数字三角形案例题目描述 Description下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 (1)每一步可沿左斜线向下或右斜线向下 (2)1 < 三角形行数 < 100 (3)三角形数字为0,1,…99 输入描述 Input Description有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第1行是输入整数(如原创 2015-05-29 10:11:34 · 24011 阅读 · 1 评论 -
【面试题】-单链表反转
问题描述将一个单链表反序输出,比如原单链表位1->2->3->4->NULL,反序输出后变为4->3->2->1->NULL解题思路原创 2015-06-15 22:29:22 · 3919 阅读 · 0 评论 -
【面试题】-链表面试题集锦及解析
单链表反转 http://blog.csdn.net/zwhlxl/article/details/45724771求未知长度的链表的中间节点 http://blog.csdn.net/zwhlxl/article/details/45725633判断单链表是否有环并找到环入口 http://blog.csdn.net/zwhlxl/article/details/45726797判断两原创 2015-05-15 17:08:15 · 806 阅读 · 0 评论 -
【面试题】-判断两个单链表是否相交并求出相交的第一结点
问题描述判断两个单链表是否相交,如果相交,给出相交的第一个点(假设两个链表都不存在环)。相交的链表示意图如下所示。 解题思路方法一两个没有环的链表如果是相交于某一结点,如上图所示,这个结点后面都是共有的。所以如果两个链表相交,那么两个链表的尾结点的地址也是一样的。程序实现时分别遍历两个单链表,直到尾结点。判断尾结点地址是否相等即可。时间复杂度为O(L1+L2)。方法二代码实现方法一void Is_原创 2015-05-15 15:53:20 · 5978 阅读 · 0 评论 -
动态规划(DP)之最长上升子序列
问题描述一个数的序列aia_i ,当a1<a2<...<aS a_1 < a_2 < ... < a_S的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2,...,aN)(a_1 , a_2, ..., a_N),我们可以得到一些上升的子序列(ai1,ai2,...,aik)(a_{i1} ,a_{i2}, ...,a_{ik}) ,这里1<=i1<i2<...<iK<=N1 <= i1原创 2015-05-30 08:57:16 · 2097 阅读 · 0 评论 -
【面试题】-判断单链表是否有环并找到环入口(快慢指针)
快慢指针所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。单链表环单链表有环的定义是链表的尾节点指向了链表中间的某个结点。比如下图。原创 2015-05-14 21:57:04 · 3786 阅读 · 0 评论 -
面试集锦
堆和栈 程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其 操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。原创 2015-06-10 08:57:09 · 461 阅读 · 0 评论 -
【剑指offer】空格替换
Question设计一种方法,将一个字符串中的所有空格替换成 %20 。你可以假设该字符串有足够的空间来加入新的字符,且你得到的是“真实的”字符长度。Solution 1需要额外的一个数组:class Solution {public: /** * @param string: An array of Char * @param length: The true len原创 2015-06-27 14:57:22 · 777 阅读 · 0 评论 -
【面试题】-反转句子
题目描述给定一个字符串句子,进行反转,不能申请额外的内存,比如“This is a sentence”,输出就是”sentence a is This”解题思路先对每个单词进行反转,结果为 “sihT si a ecnetnes” 然后再对整个句子反转,就是最终结果。 反转不能利用额外的空间,那就使用头尾指针,交换头尾指针的数据即可代码实现#include <stdio.h>#include <原创 2015-07-08 17:21:03 · 1408 阅读 · 0 评论 -
【面试题】-求未知长度的链表的中间节点(快慢指针)
快慢指针所谓的快慢指针的快慢是指指针向前移动的步长。比如在单链表中,快指针每次向前移动2个步长,慢指针则每次向前移动1个步长。解题思路快速找出未知长度的链表的中间节点,暴力解法就是先遍历真个链表,算出链表的长度,再从头遍历长度的一半,即可找出,不过这个比较费时。更巧妙的办法是运用快慢指针,将快慢指针先指向头结点,快指针移动2个步长,慢指针移动1个步长,当快指针指向链表末尾的时候,慢指针刚好就在中间节原创 2015-06-11 16:59:55 · 2956 阅读 · 1 评论 -
【面试题】寻找旋转排序数组中的最小值
题目描述假设一个旋转排序的数组其起始位置是未知的(比如0 1 2 4 5 6 7 可能变成是4 5 6 7 0 1 2)。你需要找到其中最小的元素。http://www.lintcode.com/zh-cn/problem/find-minimum-in-rotated-sorted-array/解题思路基本思想采用二分查找,不过首先要判断这个排序数组是否直接有序,如果是0 1 2 3 4 5 6原创 2015-07-11 21:42:45 · 753 阅读 · 0 评论 -
前序遍历和中序遍历树构造二叉树
样例题目来自LintCode, 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树: 2 / \1 3代码实现/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * TreeNode(int va原创 2015-07-11 16:24:21 · 845 阅读 · 0 评论 -
链表排序
描述给链表的结点进行排序。比如给出 1->3->2->0->null ,排序后 0->1->2->3->null。 这里介绍链表的插入排序和归并排序。链表插入排序插入排序就是已经前面N−1N-1个结点有序的情况下,将第NN个结点分别跟前面的有序结点比较,使前NN个结点仍然有序。跟数组的插入排序有所不同的是,数组是从后面开始比较,由于链表只能从前到后,所以链表插入排序是从前面依次开始比较。最主要的思想原创 2015-08-26 22:38:20 · 1309 阅读 · 0 评论