
算法与数据结构
文章平均质量分 65
WalkingInTheWind
这个作者很懒,什么都没留下…
展开
-
用位运算实现两个整数的加减乘除运算
位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。1.整数加法int Add(int a,int b) { for(int i = 1; i; i <<= 1) if(b & i) for(int j = i; j; j <<= 1)原创 2011-10-18 23:28:24 · 20141 阅读 · 5 评论 -
【谷歌面试题】有序输出两棵二叉查找树中的元素
题目:给出两棵二叉查找树,有序输出所有元素,时间复杂度O(n),空间复杂度O(h),h为树的高度此题就是把两棵二叉查找树的中序遍历过程结合在一起。struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};v原创 2013-05-28 11:32:18 · 4302 阅读 · 1 评论 -
文件中随机读取行问题
1. 有一个文件,如何在不知道有多少行的情况下读取该文件,从中随机选择并输出一行当我们读取第 i (i > 0) 行时,以 1 / i 的概率选择第 i 行,并替换掉原来选的行。即总选择第一行,并以概率 1 / 2 选择第 2 行,以概率 1 / 3 选择第3 行,依次类推。到文件结束时,每个行被选中的概率都相等。#include #include #include原创 2013-05-24 20:47:49 · 5621 阅读 · 1 评论 -
【谷歌面试题】找出二叉查找树中出现频率最高的元素
找出二叉查找树中出现频率最高的元素。树中结点满足left->val val val。如果多个元素出现次数相等,返回最小的元素。在一个有序数组中,我们查找出现频率最高的元素,很简单,顺序扫描一遍即可统计出。那么我们对二叉查找树也可以用类似方式统计,因为中序遍历序列就是有序序列,所以我们在中序遍历的过程中就可以统计出出现频率最高的元素。class TreeNode{public: i原创 2013-05-23 11:38:20 · 7898 阅读 · 0 评论 -
hashtable简单实现
本文中实现了一个简单的hashtable,不一定实用,但是反应出了hashtable的原理,而且若是面试中让实现一个hashtable,本文的实现足以应付,我在一次迅雷的面试中就遇到,让实现一个hashtable。本文中采用开链法(separate chaining)来处理“冲突”(collision),而且hashtable只存储唯一的元素,不存在重复。实现代码如下:class原创 2013-03-23 19:38:56 · 2804 阅读 · 1 评论 -
求能整除正整数a或b的正整数序列
题目:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,需要计算出Q中的前几项,例如,当a=3,b=5,N=6时,序列为3,5,6,9,10,12(1)设计一个函数void generate(int a, int b, int N, int * Q)计算Q的前N项(2)设计测试数据来验证函数程序在各种输入下的正确性最简单的想法就是,从1开始挨个验证,能否被a或b原创 2012-08-17 21:50:01 · 7109 阅读 · 3 评论 -
汉诺塔问题
问题描述:有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆:每次只能移动一个圆盘;大盘不能叠在小盘上面。提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须尊循上述两条规则。问:如何移?最少要移动多少次?void MoveDisk(int diskID, int srcPole, int d原创 2013-04-13 21:29:13 · 2718 阅读 · 0 评论 -
【谷歌面试题】求数组中两个元素的最小距离
一个数组,含有重复元素,给出两个数num1和num2,求这两个数字在数组中出现的位置的最小距离O(n)时间复杂度,O(1)空间复杂度int minDistance(int A[], int size, int num1, int num2){ int num1_last_pos = -1; int num2_last_pos = -1; int min_dist = INT_MAX原创 2013-05-28 16:04:03 · 6278 阅读 · 0 评论 -
常量空间遍历二叉树
我们知道遍历一棵二叉树,无论是先序遍历、中序遍历、后序遍历都需要一个O(n)大小的栈空间(系统栈或程序员控制的栈),或层次遍历需要一个O(n)大小的队列。那么如何在常量空间内遍历呢?本文介绍Deutsch-Schorr-Waite算法,可以使用常量空间、线性时间遍历任意图。本文主要以二叉树为例(二叉树是特殊的有向图)。算法的关键是指针反转。当访问过程向下遍历子树时,它“反转”它所经过的指针原创 2013-05-16 08:50:31 · 3989 阅读 · 3 评论 -
数组中只出现一次的数字
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/8138766题目一:一个整型数组里除了1个数字只出现一次之外,其他的数字都出现了两次。请写出程序找出这个只出现1次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。这个很简单,通过异或就可以除掉相同的数字,到最后只剩下一个只出现一次原创 2012-11-01 22:53:36 · 3134 阅读 · 0 评论 -
【微软面试题】在二叉搜索树中找最小的大于某个key值的节点
在二叉搜索树中找最小的大于某个key值的节点如 8 / \ 6 12 / / \2 11 14key = 8 返回11key = 1 返回2key = 16 返回NULLstruct TreeNode{ int val; TreeNode原创 2013-05-16 23:29:40 · 6619 阅读 · 0 评论 -
轻松搞定面试中的二叉树题目
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7518888树是一种比较重要的数据结构,尤其是二叉树。二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之分,其次序不能任意颠倒。二叉树是递归定义的,因此,与二叉树有关原创 2012-08-29 21:24:37 · 262961 阅读 · 73 评论 -
二分查找,你真的掌握了吗?
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/8937978二分查找,最基本的算法之一,也是面试中常被考察的重点,因为基本的算法最能反映出一个人的基础是否扎实。本文对二分查找相关题目做一个总结。题目列表:1. 给定一个有序(非降序)数组A,求任意一个i使得A[i]等于target,不存原创 2013-05-21 19:58:29 · 18425 阅读 · 13 评论 -
复杂链表的复制
本文参考:http://zhedahht.blog.163.com/blog/static/254111742010819104710337/题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下:struct ComplexNode{ int m_nValue;原创 2011-10-31 15:07:39 · 2384 阅读 · 0 评论 -
【谷歌面试题】给出一个数组A,找出一对 (i, j)使得A[i] <= A[j] (i < j)并且j-i最大
题目:给出一个数组A,找出一对 (i, j)使得A[i] 最直接的想法就是对于每一个 i 从数组最尾端开始向前找到第一个大于等于 A[i] 的位置 j ,时间复杂度O(n^2)。pair find(const vector &A){ int n = A.size(); if(n == 0) throw new invalid_argument("Array's size ca原创 2013-05-28 10:20:27 · 7329 阅读 · 4 评论 -
【谷歌面试题】找出字符串中只包含两种字符的最长子串
给出一个字符串,找出只包含2种字符的最长子串。如aabbcbbbadef,结果是bbcbbb。string longestSubStrWith2Chars(const string &s){ int len = s.length(); // 空串返回空串 if(len == 0) return ""; char ch1, ch2; int ch1LastPos, ch2原创 2013-05-16 11:38:45 · 4293 阅读 · 1 评论 -
随机抽样算法
问题描述:程序的输入包含两个整数m和n,其中mvoid GenerateKnuth(int m,int n){ int t=m; for(int i=0;i<n;i++) if(Rand(0,n-1-i)<t)//即以t/(n-i)的概率执行下面的语句 { printf("%d\n",i); t--; }}其中Rand(a,b)随机产生[a原创 2011-10-28 23:31:38 · 5330 阅读 · 0 评论 -
Manacher算法求最长回文子串
Manacher算法是时间复杂度为O(n)的求最长回文子串的算法算法的主要思想是从左到右处理字符串,求每个位置为中心的两端对称的最大半径。由于我们只考虑以每个位置为中心,所以要把字符串转换一下,如字符串babbcaa,转换成@#b#a#b#b#c#a#a#$,这样就可以统一处理了。void Manacher(char s[],int n,int radi原创 2012-11-21 22:05:15 · 1923 阅读 · 0 评论 -
二叉查找树转变成有序的双向链表
题目要求:将二叉查找树转换成排序的双向链表,不能创建新节点,只调整指针。查找树的结点定义如下:class Node{public: Node(int x):left(NULL),right(NULL),data(x){}; Node * left; Node * right; int data;};既然是树,其定义本身就是递归的,自原创 2011-10-18 23:56:22 · 3519 阅读 · 0 评论 -
轻松搞定面试中的链表题目
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/7393134链表是最基本的数据结构,面试官也常常用链表来考察面试者的基本能力,而且链表相关的操作相对而言比较简单,也适合考察写代码的能力。链表的操作也离不开指针,指针又很容易导致出错。综合多方面的原因,链表题目在面试中占据着很重要的地位。本文对链原创 2012-04-21 15:45:25 · 61293 阅读 · 45 评论 -
对数在算法题目中的应用
1.对数的性质(1) alogab=b(2) logaa=1(3) loga(M*N)=logaM+logaN(4) loga(M÷N)=logaM-logaN(5) loga(Mn)=nlogaM(6) logaM1/n=logaM/n(7) logab*logba=12. 相关题目(1) 求 N ! (1 中有多少位数字。若直接求 N ! 的结果,然原创 2011-12-01 20:26:07 · 3380 阅读 · 3 评论 -
寻找发帖“水王”--《编程之美》笔记
Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?分析与解法首先想到的是一个最直接的方法,我们可以原创 2011-10-31 12:28:33 · 4418 阅读 · 0 评论 -
A*路径搜寻算法
A*搜寻算法,俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中的NPC(Non-Player-ControlledCharacter)的移动计算,或线上游戏的BOT(ROBOT)的移动计算上。该算法像Dijkstra算法一样,可以找到一条最短路径;也像BFS一样,进行启发式的搜索。A*算法是一种启发式搜索算法,启发式搜索就是在状态空间中的搜索对每一个搜原创 2011-11-21 16:17:40 · 11226 阅读 · 2 评论 -
一个Trie树的实现
Trie树实现代码:// Max branch number. Such as 26 for lower case letter set, 10 for digit character set.const int MAX_BRANCH_NUM = 26;// Node of Trie Tree class CTrieNode{public: CTrieNode(原创 2011-11-30 22:08:26 · 2425 阅读 · 0 评论 -
求质数总结
质数又称素数。指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数。一、判断一个数是否为质数首先根据定义,最简单的判断一个数n是否为质数的方法,就是从2开始对小于n的所有数,依次判断是否能整除n,若都不能整除就是质数。bool IsPrime(int n){ if(n == 1) return false; for(int i = 2; i < n;原创 2011-12-04 20:31:44 · 6564 阅读 · 2 评论 -
经典面试题:链表的相交与环问题
版权所有,转载请注明出处,谢谢!http://blog.csdn.net/walkinginthewind/article/details/70740221. 给出两个单向链表的头指针pHead1和pHead2,判断这两个链表是否相交。假设两个链表均不带环。示意图如下:如果两个链表相交于某一节点,那么在这个相交节点之后的所有节点都是两个链表所共有的。也就是说,如果两个原创 2011-12-15 14:35:59 · 5485 阅读 · 5 评论 -
判断二进制数中的1有奇数个还是偶数个
判断(32位)整数的二进制表示中的1有奇数个还是偶数个最直接的思路就是求二进制数中1的个数,然后确定是偶数还是奇数。代码如下:// true为x二进制表示中含有奇数个1,false为偶数个1bool OddOnes(int x) { int cnt = 0; while(x) { cnt++; x &= x-1; } return cnt & 1;}上述代码原创 2012-02-10 16:59:07 · 9756 阅读 · 0 评论 -
二叉树的遍历
二叉树的遍历包括先序遍历,中序遍历,后序遍历,层次遍历等等。本文对此进行整理。二叉树结构定义如下://Definition for binary treestruct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(N原创 2013-03-21 18:54:31 · 2945 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。用PN,S来表示N个骰子,顶面数字之和为S出现的概率,则:PN,S=aN,S/6^N其中aN,S为N个骰子顶面数之和为S的状态的数量,6^N为总的状态数量,因为每个骰子有6种状态,N个骰子组成的状态数就是6^N。下面给出求ai,j的递推公式,即求i(1=个骰子顶面数之和为j(原创 2011-11-10 09:33:01 · 1964 阅读 · 0 评论 -
和为n连续正数序列
题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。我们从头开始找,初始化时连续序列是1-2,同时记录sum=3,如果连续序列和小于n,那么就把连续序列区间的终点向后移,更新sum;如果连续序列的和大于n,那么就把连续序列区间的起点向后移,更新sum;如原创 2011-11-16 10:16:57 · 2569 阅读 · 2 评论