数据结构与算法
文章平均质量分 57
静水流风
精通C++,喜欢研究算法
展开
-
如何判断一个非负整数是否是2的幂
如何判断一个数是2的幂,主要是要找出2的幂次方的数的特点。我们知道,1个数乘以2就是将该数左移1位,而2的0次幂为1, 所以2的n次幂(就是2的0次幂n次乘以2)就是将1左移n位, 这样我们知道如果一个数n是2的幂,则其只有首位为1,其后若干个0,必然有n & (n - 1)为0。(在求1个数的二进制表示中1的个数的时候说过,n&(n-1)去掉n的最后一个1)。因此,判断一个数n是否为2的幂,只需转载 2014-10-24 09:49:41 · 547 阅读 · 0 评论 -
桶排序
桶排序 (Bucket sort)或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序)。桶排序是鸽巢排序的一种归纳结果。当要被排序的数组内的数值是均匀分配的时候,桶排序使用线性时间(Θ(n))。但桶排序并不是 比较排序,他不受到 O(n log n) 下限的影响。桶排序以下列程序进行:转载 2014-12-06 09:35:52 · 482 阅读 · 0 评论 -
求二叉树中节点的最大距离
编程之美: 求二叉树中节点的最大距离原创 2014-11-03 09:12:25 · 517 阅读 · 0 评论 -
一道只能用乘法不能用除法的数组面试题
1、给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:不允许使用除法;要求O(1)空间复杂度和O(n)时间复杂度;除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);请用程序实现并简单描述。解答:数组分割10 void output(long long原创 2014-11-01 15:48:50 · 1900 阅读 · 0 评论 -
求一个论坛的在线人数
,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。一天总共有 3600*24 = 86400秒。定义一个长度为86400的整数数组int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。然后依次读入每个用户的登录时间和退转载 2014-11-11 09:40:33 · 1182 阅读 · 0 评论 -
Manacher算法
给定一个子符串S,找出最长回文子串原创 2014-11-15 13:25:02 · 421 阅读 · 0 评论 -
用按位异或运算符交换两个数,不引入第三个变量
按位异或:一:定义异或运算:^。简单点说就是异或的两个值'相同为假,不同为真'。抑或运算的一些规则原理:1. 异或运算符合交换率。2. 按位异或的3个特点: (1) 0^0=0,0^1=1 0异或任何数=任何数 (2) 1^0=1,1^1=0 1异或任何数=任何数取反 (3) 任何数异或自己=把自己置0二:异或运算法则原创 2014-10-30 21:03:19 · 1328 阅读 · 0 评论 -
网络上搜集的面试题
假设需要将N个任务分配给N个工人同时去完成,每个人都能承担这N个任务,但费用不 同.下面的程序用回溯法计算总费用最小的一种工作分配方案,在该方案中,为每个人分配 1个不同的任务. 程序中,N个任务从0开始依次编号,N个工人也从0开始依次编号,主要的变量说明如下: c[i][j]:将任务i分配给工人j的费用; task[i]:值为0表示任务i未分配,值为j表示任务i分配转载 2014-10-30 20:15:28 · 3156 阅读 · 0 评论 -
Longest Palindromic Substring (最长回文子串)
题目:https://oj.leetcode.com/problems/longest-palindromic-substring/翻译 2014-11-14 21:11:17 · 470 阅读 · 0 评论 -
Gas Station (环形加油站)
题目:有n个加油站首尾相连成一个圆,已知每个加油站的油量,以及从第i个加油站到第i+1个加油站需消耗的油量,问:能否开车从某个加油站出发,循环一圈又回到起点,如果可以返回出发的起点(车的邮箱容量是无限的)。原创 2014-11-14 10:29:26 · 1850 阅读 · 0 评论 -
【链表篇】链表面试题集
1. 给定单链表,检测是否有环。如果有环,则求出进入环的第一个节点。 判断单向链表是否有环,可以采用快指针与慢指针的方式来解决。即定义一个快指针fast和一个慢指针slow,使得fast每次跳跃两个节点,slow每次跳跃一个节点。如果链表没有环的话,则slow与fast永远不会相遇(这里链表至少有两个节点);如果有环,则fast与slow将会在环中相遇。判断出链表有环以后,则需要算出进入环的第一个转载 2014-10-24 13:43:47 · 490 阅读 · 0 评论 -
链表有关的常见面试题
1.单链表逆序实现1:遍历: 1: /* 2: * 遍历链表, 将每个结点的next置为其前驱 3: * 遍历过程中需要额外的指针来记录结点的前驱和后继 4: */ 5: LinkList ReverseList(LinkList L) 6: { 7: if (!L || !L->next) {转载 2014-10-24 11:41:02 · 488 阅读 · 0 评论 -
求两个有序数组的中位数之非递归实现
人禾int find_median(int *a, int lengtha, int *b, int lengthb){ assert(lengtha > 0); assert(lengthb > 0); int *sa = lengtha <= lengthb ? a : b; int *la = lengtha <= lengthb ?原创 2014-11-10 19:18:29 · 698 阅读 · 0 评论 -
有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?
申请10w个bit的空间,每个bit代表一个数字是否出现过。开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。然后依次读入已经打乱循序的数字,并将对应的bit设为1。当处理完所有数字后,根据为0的bit得出没有出现的数字。 首先计算1到10w的和,平方和。然后计算给定数字的和,平方和。两次的到的数字相减,可以得到这两个数字的和,平方和。所以我们有x转载 2014-11-11 10:44:06 · 1379 阅读 · 0 评论 -
求海量个无序整数的中位数
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。不妨假设10G个整数是64bit的。2G内存可以存放256M个64bit整数。我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。如果中数所在范围出现转载 2014-11-11 10:07:58 · 965 阅读 · 0 评论 -
求一个数的二进制表示中1的个数
实现1:使用按位与和移位操作符,逐位进行统计。需要注意的是,对于有符号的右移操作符号位如何处理是不确定的,因此我们在进行移位操作前要将有符号型转换为无符号型。 1: int bitcount(int n) 2: { 3: unsigned int count = 0, m = n; /* 注意, 我们这里需要将输入转化为无符号类型 */ 4:转载 2014-10-24 11:35:34 · 444 阅读 · 0 评论 -
求排序数组的元素的绝对值的最小值
求排序数组的元素的绝对值的最小值分类: C/C++2012-10-04 18:43 249人阅读 评论(0) 收藏 举报题目:一个有序数组(从小到大排列),数组中的数据有正有负,求这个数组中的最小绝对值。思路:一个简单的思路,就是一次性遍历数组,求出数组的元素的绝对值的最小值,这样的时间复杂度为O(n)。但是,这样就浪费了题目的一个条件:数组是已经排好序的。所以,需要对转载 2014-10-24 14:15:48 · 902 阅读 · 0 评论 -
Additive Number -- leetcode
Additive number is a string whose digits can form additive sequence.A valid additive sequence should contain at least three numbers. Except for the first two numbers, each subsequent number in the原创 2016-08-07 17:37:32 · 347 阅读 · 0 评论