Data structure & algorithm
文章平均质量分 79
happy_XYY
机器学习 C++ Java 算法
展开
-
剑指offer-4-面试24:二叉搜索树的后序遍历序列
题目 分析 测试用例代码 本题考点 相关题目举一反三 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 分析 例如,输入数组{ 5,7,6,9,11,10,8},则返回true,因为这个整数序列是图 4.6二叉搜索树的后续遍历结果。如果输入的数组是{7,4,6,5},由于没有那颗二原创 2016-07-08 16:21:18 · 711 阅读 · 0 评论 -
数据结构与算法:图
图论是计算机研究的一个重要分支,有关图论的内容可以写很多,但正是因为图论的这种复杂性,在程序员面试笔试中,有关图论的问题并不多见,考察的也并不深奥。本节内容涉及一些经常出现的图论问题,并给予详细的解答。原创 2016-06-19 11:30:30 · 1593 阅读 · 0 评论 -
剑指offer-5-面试36:数组中的逆序对(时间效率和空间效率的平衡)
题目 分析 测试用例代码 本题考点 题目 在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。 分析 看到这个题目,我们第一反应是顺序扫描整个数组。每扫描到一个数字的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组成了一个逆序对。假设数组中含有 n 个数字。由于每个数字都要和O(n)个数原创 2016-07-15 15:39:37 · 799 阅读 · 0 评论 -
剑指offer-5-面试35:第一个只出现一次的字符
题目 分析 测试用例代码 本题考点 本题扩展相关题目 题目 在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出‘b’ 分析 最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)原创 2016-07-15 13:25:24 · 746 阅读 · 0 评论 -
数据结构与算法:二叉树
二叉树是一种非常常见并且实用的数据结构,它结合了有序数组与链表的优点。在二叉树中查找数据与在数组中查找数据一样快,在二叉树中添加、删除数据的速度也和在链表中一样高效,所以有关二叉树的相关技术一直是程序员面试笔试中必考的知识点。原创 2016-06-18 10:57:38 · 4530 阅读 · 0 评论 -
剑指offer-5-面试34:丑数(优化时间和空间效率)
题目 分析 逐个判断每个整数是不是丑数的解法直观但不够高效创建数组保存已经找到的丑数用空间换时间的解法 测试用例代码 本题考点 题目 我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如 6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把 1 当做第一个丑数。 分析 逐个判断每个整数是不是丑数的解法,直观但不够高效所谓一个原创 2016-07-15 10:35:12 · 991 阅读 · 0 评论 -
剑指offer-5-面试33:把数组排成最小的数(时间效率)
题目 分析 测试用例代码 本题考点 题目 输入一个正整数数组,把数组里所有数字拼接起来拍成一个树,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这 3 个数字能排成的最小数字 321323. 分析 最直接的做法是先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最小值。其实,此题可以找到一个排序规则,数组根据这个规则排序之后能排原创 2016-07-14 20:58:09 · 724 阅读 · 0 评论 -
剑指offer-5-面试32:从 1 到 n 整数中 1 出现的次数(时间效率)
题目 分析 不考虑时间效率的解法靠它想拿offer有点 难从数字规律着手明显提高时间效率的解法能让面试官耳目一新 测试用例代码 本题考点 题目 从 1 到 n 整数中 1 出现的次数。题目 :输入一个整数 n ,求从 1 到 n 这n 个整数的十进制表示中1 出现的次数。 例如 输入 12,从 1 到 12 这些整数中包含 1 的数字 有 1, 10 ,11 和 12, 1 一共出现了原创 2016-07-14 17:32:18 · 659 阅读 · 0 评论 -
剑指offer-5-面试31:连续子数组的最大和(时间效率)
题目 分析 测试用例代码 本题考点 题目 输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)例如,输入的数组为 {1,-2, 3, 10,-4,7,2,-5 },和最大的子数组为 {3,10,-4,7,2 },因此输出为该子数组的和 18. 分析 看到 测试用例&代码 本原创 2016-07-14 15:57:14 · 737 阅读 · 0 评论 -
数据结构与算法:排序
排序问题一直是计算机技术研究的重要问题,排序算法的好坏直接影响程序的执行速度和辅助存储空间的占有量,所以各大IT企业在笔试面试中也经常出现有关排序的题目。本节详细分析常见的各种排序算法,并从时间复杂度、空间复杂度、适用情况等多个方面对它们进行综合比较。原创 2016-06-16 22:00:14 · 2528 阅读 · 4 评论 -
数据结构与算法:STL容器
STL(Standard Template Library)是一个C++领域中,用模板技术实现的数据结构和算法库,其中的vector、list、stack、queue等结构不仅拥有更强大的功能,还有了更高的安全性。它体现了泛型编程的思想,具有高度的可重用行、高性能、高移植性原创 2016-06-15 17:15:12 · 974 阅读 · 0 评论 -
剑指offer-4-解决面试题的思路
面试官谈面试思路画图让抽象问题形象化举例让抽象问题具体化分解让复杂问题简单化面试官谈面试思路编码前讲自己的思路是一个考察指标。合格的应聘者需要在做事之前明白自己要做的事情究竟是什么,以及该怎么做。一开始就编码的人员,除非后面表现非常优秀,否则很容易通不过。可以采用举例子、画图等多种方式,解释清楚问题本身和问题解决方案是关键。画图让抽象问题形象化画图是在面试过程中应聘者用来帮助自己分析、推理的原创 2016-07-12 19:38:00 · 1882 阅读 · 0 评论 -
剑指offer-6-面试43:n 个骰子的点数()
题目 分析 测试用例代码 本题考点 题目 分析 测试用例&代码 本题考点原创 2016-07-17 14:44:02 · 737 阅读 · 0 评论 -
海量数据处理:算法
海量信息即大规模数据,随着互联网技术的发展,互联网上的信息越来越多,如何从海量信息中提取有用信息成为当前互联网技术发展必须面对的问题。在海量数据中提取信息,不同于常规量级数据中提取信息,在海量信息中提取有用数据,会存在以下几个方面的问题:(1)数据量过大,数据中什么情况都可能存在,如果信息数量只有20条,人工可以逐条进行查找、比对,可是当数据规模扩展到上百条、数千条、数亿条,甚至更多时,仅仅只通过手工已经无法解原创 2016-06-20 21:54:08 · 9754 阅读 · 0 评论 -
剑指offer-4-面试23:从上往下打印二叉树
题目 分析 本题考点 本题扩展 举一反三 题目 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如,输入图4.5中的二叉树,则依次打印出8、6、10、5、7、9、11 二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeN原创 2016-07-08 13:25:38 · 856 阅读 · 0 评论 -
剑指offer-4-面试题22:栈的压入、弹出序列
题目 分析 测试用例代码 本题考点 题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1、2、3、4、5 是某栈的压栈序列,序列 4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。 分析 解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依原创 2016-07-07 22:09:40 · 759 阅读 · 0 评论 -
剑指offer-4-面试21:包含min函数的栈
题目 分析 测试用例代码 本题考点 题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及 pop的时间复杂度都是O(1) 分析 看到这个问题,我们第一反应可能时每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,这样就能在O(1)时间得到最小元素了。但这种思路不能保证最后压入栈的元素能够最先出栈,因此这个数据结构原创 2016-07-07 17:17:21 · 622 阅读 · 0 评论 -
剑指offer-4-面试题20:顺时针打印矩阵(画图使抽象问题形象化)
题目 分析 测试用例代码 本题考点 题目 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16则依次打印出数字 1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10 分析 这道题完全没有涉及复杂的数据结构原创 2016-07-07 15:11:41 · 786 阅读 · 0 评论 -
剑指offer-4-面试19:二叉树的镜像
题目 分析 测试用例代码 本题考点 题目 完成一个函数,输入一个二叉树,该函数输出它的镜像二叉树结点的定义如下:struct BinaryTreeNode{ int m_nvalue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;}; 分析 树的镜像对很多人来说会是一个新的概念,未必一下子能够想出求树的镜原创 2016-07-07 10:29:46 · 534 阅读 · 0 评论 -
剑指offer-3-面试题11:数值的整数次方(对错误的处理)
题目 分析 自以为题目简单的解法全面但不够高效的解法全面又高效的解法 测试用例代码 本题考点 题目 实现函数 double Power( double base, int exponent ),求base 的 exponent 次方。不得使用库函数,同时不需要考虑大数问题。本题要求实现类似于pow的功能。要求实现特定库函数(特别是处理数值和字符串的函数)的功能,是一类常见的面试题。原创 2016-06-29 22:01:30 · 1241 阅读 · 0 评论 -
剑指offer-3-面试14:调整数组顺序使奇数位于偶数前面
题目 分析 只完成基本功能的解法仅适用于初级程序员考虑可扩展性的解法能秒杀offer 测试用例代码 本题考点 题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。 分析 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有数字往前挪动一位。挪完之后在数组原创 2016-07-04 17:33:04 · 604 阅读 · 0 评论 -
剑指offer-3-面试13:在O(1)时间删除链表结点
题目 分析 测试用例代码 本题考点 题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:struct ListNode{ int m_nValue; ListNode *m_pNext;};void DeleteNode( ListNode** pListHead, ListNode*原创 2016-07-03 10:49:58 · 2026 阅读 · 0 评论 -
剑指offer-3-面试16:反转链表
题目 分析 测试用例代码 本题考点 本题扩展 题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。链表的定义如下:struct ListNode{ int m_nkey; ListNode* m_pNext;}; 分析 不难注意到,由于结点 i 的m_pNext指向了它的前一个结点,导致我们无法在链表中遍历到结点 j 。为了避免链表在结点i原创 2016-07-06 19:50:28 · 645 阅读 · 0 评论 -
剑指offer-3 -高质量的代码
代码质量代码的规范性代码的完整性从3方面确保代码的完整性3种错误处理的方法代码的鲁棒性代码质量下面是几个面试官对代码质量的要求(1)代码的容错能力,对一些特别的输入需要考虑异常状况,考虑资源的回收问题。。。(2)一些基本的知识点,如double 类型的数据比较的问题。if( d1==d2 ) 上述比较有问题,由于精度原因不能用等号判断两个小数是否相等。(3原创 2016-07-06 22:26:10 · 879 阅读 · 0 评论 -
剑指offer-3-面试15:链表中倒数第k个结点
题目 分析 测试用例代码 本题考点 相关题目举一反三 题目 输入一个链表,输出该链表中第K个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如,一个链表有6个结点,从头结点开始它们的值依次是 1、2、3、4、5、6 。这个链表的倒数第3个结点是值为4的结点。 链表结点定义如下:struct ListNode{ int m_nValue;原创 2016-07-06 19:17:41 · 564 阅读 · 0 评论 -
剑指offer-4-面试26:复杂链表的复制
题目 分析 测试用例代码 本题考点 题目 请实现函数 ComplexListNode* Clone( ComplexListNode* pHead ),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个 m_pSibling指向链表中的任意结点或者NULL。结点的C++定义如下。struct ComplexListNode{ int原创 2016-07-12 12:44:51 · 783 阅读 · 0 评论 -
剑指offer-4-面试25:二叉树中和为某一值的路径
题目 分析 测试用例代码 本题考点 题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的结点形成一条路径。二叉树结点的定义如下:struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRigh原创 2016-07-11 17:39:18 · 601 阅读 · 0 评论 -
数据结构与算法:字符串
将字符串逆序普通逆序原地逆序不允许临时变量的原地逆序按单词逆序如何实现逆序打印找出一个字符串中第一个只出现一次的字符将字符串逆序给定一个字符串s,将s中的字符顺序颠倒过来,如 s=’abcd’,逆序后变成 s=’dcba’。可以采用多种方法对字符串进行逆序,一下将对其中的一些方法进行分析普通逆序直接分配一个与原字符串等长的字符数组,然后反向拷贝即可原地原创 2016-06-13 20:55:20 · 1414 阅读 · 0 评论 -
十道海量数据处理题与十个方法大总结
作者:July、youwang、yanxionglu。 时间:二零一一年三月二十六日 本文之总结:教你如何迅速秒杀掉:99%的海量数据处理面试题。有任何问题,欢迎随时交流、指正。 出处:http://blog.csdn.net/v_JULY_v。第一部分十道海量数据处理面试题1海量日志数据提取出某日访问百度次数最多的那个IP2搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来每转载 2016-04-24 16:08:23 · 2726 阅读 · 0 评论 -
中缀表达式转换成后缀
题目要求: 给定一表达式,求其后缀表达式 a+b*c+(d*e+f)g ———>bc+de*f+g*+算法: 中缀表达式转后缀表达式的方法: 1.遇到操作数:直接输出(添加到后缀表达式中) 2.栈为空时,遇到运算符,直接入栈 3.遇到左括号:将其入栈 4.遇到右括号:执行出栈操作,并将出栈的元素输出,直到弹出栈的是左括号,左括号不输出。 5.遇到其他运算符:加减乘除:弹出所有优先级大原创 2016-04-24 15:46:13 · 814 阅读 · 0 评论 -
字符串匹配(KMP 算法 含代码)
串(string或字符串)是由零个或多个字符组成的有限序列,一般记为 其中s是串的名,用单引号括起来的字符序列是串的值;ai(1串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应的称为主串。通常称字符在序列中的序号为该字符在串中的位置。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。下面主要说一下串的模式匹配算法传统的串匹配法算法的基本思想是:从主串原创 2016-04-21 17:14:15 · 4930 阅读 · 0 评论 -
用异或巧妙的解决对比问题
问题描述:给出2n+1个数 其中有n个数是成对出现的 找出里面只出现了一次的那个数 当然 如果先快排完了 排除掉相同的数 当然可以找到那个只出现过一次的数 但是快排的复杂度是n*logn 据说可以用O(n)复杂度和O(1)的额外空间解决原Blog地址: 简便方法求解一道算法题目利用^操作符,将数组中的数字逐位异或,如果是与自身相同的数字异或则结果为0,否则结果为本身。源代码:#include<std转载 2016-04-21 09:34:50 · 1384 阅读 · 0 评论 -
完美洗牌问题(数组间数据有规律的交叉)
题目详情:有个长度为2n的数组{a1,a2,a3,…,an,b1,b2,b3,…,bn},希望排序后{a1,b1,a2,b2,….,an,bn},请考虑有无时间复杂度o(n),空间复杂度0(1)的解法。问题描述解法一蛮力变换1步步前移2中间交换解法二完美洗牌算法1位置置换pefect_shuffle1算法2分而治之perfect_shuffle2算法3完美洗牌算法perfect_shu转载 2016-05-03 17:07:47 · 4484 阅读 · 0 评论 -
完美洗牌问题(打乱数组间各元素的顺序)
除了前一篇的完美洗牌问题,还有一种洗牌,就是乱序(shuffle)的问题,将54张有序的扑克牌的顺序打乱,实现洗牌操作。局部洗牌法1。随机产生一个1-n的数x,做为第一张牌。 2。随机产生一个1-(n-1)的数y,如果y<x,则将y作为第二张牌,否则将y+1作为第二张牌。 3。随机产生一个1-(n-i)的数z,取第z个没有被抽出来的作为第i张牌。(i=3,4,5…54) 这种算法的复杂度为O(原创 2016-05-04 16:32:46 · 5741 阅读 · 1 评论 -
小程序:全排列
1.全排列就是从第一个数字起每个数分别与它后面的数字交换。2.去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。3.全排列的非递归就是由后向前找替换数和替换点,然后由后向前找第一个比替换数大的数与替换数交换,最后颠倒替换点后的所有数据。全排列的递归实现举个例子,123的全排列有123、132、213、231、312、321,通过观察可以发现,全排列就是从第一个数字起每个数分别于它原创 2016-05-05 20:45:46 · 1630 阅读 · 0 评论 -
实用算法的分析与程序设计——递推法(倒推法)
倒推法就是在不知初始值的情况下,经某种递推关系而获知问题的解或目标,再倒过来,推知它的初始条件。因为这类问题的运算过程是一一映射的,故可分析得其递推公式,然后再从这个解或目标出发,采用倒推手段,一步步地倒推到这个问题的初始陈述。贮油点 一辆重型卡车欲穿过1000公里的沙漠,卡车耗油为1升/公里,卡车总载油能力为500公升,显然卡车装一次油是过不了沙漠的,因此四级必须设法在沿途建立几个贮油点,使原创 2015-04-27 10:01:33 · 3661 阅读 · 0 评论 -
实用算法的分析与程序设计——分治算法(归并排序,快速排序)
有许多算法在结构上是递归的:为了解决一个给定问题,算法要一次或多次地调用其自身来解决相关的子问题。这些算法通常采用分治策略:将原问题分成n个规模较小而结构与原问题相似的子问题。递归地解这些子问题,然后合并其结果就得到原问题的解。N=2时的分治法又称二分法。用分治法求解一个问题,所需的时间是由子问题的个数,大小以及把这个问题分解为子问题所需的工作总量来确定的。一般来说,二分法(即把任意大小的问题原创 2015-05-22 10:02:15 · 1418 阅读 · 0 评论 -
实用算法的分析与程序设计——贪心算法(包含实例,代码)
包含删数问题,0-1背包和部分背包问题贪心法也是从问题的某一个初始解出发,向给定的目标递推,但不同的是,推进的每一步不是依据某一固定的递推式,而是做一个当时看似最佳的贪心选择,不断地将问题实例归纳为更小的相似的子问题,并期望通过所做的局部最优选择产生出一个全局最优解。这种选择未必能得出全局最优解,在下面的实例中可得到全局最优。注意:编写这几个程序的过程发现在linux gcc编译的程序数组越界不会提原创 2015-05-08 10:42:18 · 3338 阅读 · 0 评论 -
实用算法的分析与程序设计——递推法(顺推法)包含实例,代码
顺推法即由边界条件出发,通过递推关系式推出后项值,再由后项值按递推关系式推出再后项值。。。依次递推,直至从问题初始陈述向前推进到这个问题的解为止。实例代码#include<iostream>#include<stdlib.h>using namespace std;const int maxN = 60 ;int N = 4 ,d = 2 , m = 3;float a1 = 2 ,an =原创 2015-05-07 19:19:08 · 3091 阅读 · 0 评论 -
数据结构与算法:数组(一)
数据结构与算法是计算机发展的基石,现代计算机的起源是数学,数学的核心是算法,计算机历史上每一次大的变革都离不开算法的推动。纵然“条条大路通罗马”,但好的算法永远比提高硬件设备管用。在排序数组中找出给定数字出现的次数计算两个有序整型数组的交集如何找出数组中重复次数最多的数在On的时间复杂度内找出数组中出现次数超过了一半的数找出数组中唯一的重复元素解题方法引申一没有要求每个数组只访原创 2016-06-02 08:29:28 · 3294 阅读 · 0 评论