
算法学习笔记
文章平均质量分 80
yin4ever
这个作者很懒,什么都没留下…
展开
-
求二进制中1的个数
求二进制中1的个数。对于一个字节(8bit)的变量,求其二进制表示中"1"的个数,要求算法的执行效率尽可能的高。 编程之美书中给出了如下几种解法:解法一,每次除二,看是否为奇数,是的话就累计加一,最后这个结果就是二进制表示中1的个数。解法二,同样用到一个循环,只是里面的操作用位移操作简化了。 1: int Count(int v) 2: {原创 2014-02-25 10:45:23 · 1199 阅读 · 0 评论 -
数组循环移位
#include#includeusing namespace std;//method1/*简单的办法,可以每次将数组中的元素右移一位,循环k次。不妨设k是一个非负的整数,当k为负整数的时候,右移k位,相当于左移(-k)位。左移和右移本质上是一样的。大家开始可能会有这样潜在的假设,k但严格来说,我们不能用这样的“惯性思维”来思考问题。尤其在编程的时候,要全转载 2014-03-04 22:54:09 · 639 阅读 · 0 评论 -
编程之美2.20 程序理解和时间分析
题目如下:阅读以下C#代码,回答问题:using System;using System.Collections.Generic;using System.Text; namespace FindTheNumber{ class Program { static void Main(string[] args) {转载 2014-03-04 19:19:49 · 707 阅读 · 0 评论 -
只考加法的面试题
我们知道:1+2 = 3;4+5 = 9;2+3+4 = 9。等式的左边都是两个或两个以上连续的自然数相加,是不是所有的整数都可以写成这样的形式呢?问题1: 对于一个64位正整数,输出它所有可能的连续自然数(两个以上)之和的算式。问题2: 大家在测试上面程序的过程中,肯定会注意到有一些数字不能表达为一系列连续的自然数之和,例如32好像就找转载 2014-03-04 19:50:48 · 651 阅读 · 0 评论 -
编程之美2.19——区间重合判断(线段树)
问题:1. 给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。2. 给定一个窗口区域和系统界面上的N个窗口,判断这个窗口区域是否被已有的窗口覆盖。1. 解法:先用区间的左边界值对目标区间进行排序O(nlogn),对排好序的区间进行合并O(n),对每次待查找的源区间,转载 2014-03-04 23:01:53 · 723 阅读 · 0 评论 -
求数组中最长递增子序列
编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度。例如,在序列1,3,2中,最长递增序列是1,3.这道题,也是腾讯2012校园招聘中的一道题,其实,这道题符合无后效性的要求,我们可以任取从从数组开始时开始的任意子序列,这个子序列的状态无法直接影响将来的决策。换句话说,每个状态是过去历史的一个完整总结。我们可以定义一个存放每个子序列的最长序列值的数组L,L里面原创 2014-03-04 22:42:20 · 704 阅读 · 0 评论 -
计算字符串的相似度
问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为原创 2014-03-06 19:19:20 · 816 阅读 · 0 评论 -
字符串移位包含问题
问题描述: 给定两个字符串S1和S2,要求判定S2是否能够被S1做循环移动得到的字符串包含。如S1=AABCD和S2=CDAA,则S1循环移动后包含S2,返回true;S1=ABCD和S2=ACBD,则S1循环移动后不包含S2,返回false 解题思路: 1)可以发现,S1循环移动后的结果肯定包含在字符串S1+S1中,所以可以直接判断S2是否包含在字转载 2014-03-06 19:02:19 · 792 阅读 · 0 评论 -
队列中取最大值操作问题
队列中取最大值操作问题分析:这个问题和设计一个在O(1)时间内取最大值的堆栈看似比较相似,但实现难度要比最大值的堆栈困难一些,开始想模仿最大值堆栈的思想来设计取最大值的堆栈都失败了。实际上这个问题可以拆分成两个问题: 1)设计一个在O(1)时间内取最大值的堆栈; 2)如何使用堆栈来实现一个队列;如果这两个问题解决了,O(1)时间取最大值的队列也就解决了,这体现了把一个困难的转载 2014-03-07 10:02:46 · 762 阅读 · 0 评论 -
AVL树及其C++实现
折腾了一天,总算弄明白了点AVL树。其实概念上还是挺好理解的,无非是左旋右旋,但是个人认为最难理解的就是旋转后如何处理结点的bf值,即旋转后是左高还是右高还是平衡。各个教材中讲的都不详细,太难理解了,后来上网找到了一篇http://www.cnblogs.com/longdouhzt/archive/2011/07/20/2112089.html,确实读了很有帮助,觉得教材中写的弱爆了。。。。。。原创 2014-03-15 11:49:35 · 986 阅读 · 0 评论 -
LeetCode - Gray Code
哎这道题开始想麻烦了,一直在寻找规律。其实没有什么规律,用一个set保存已有序列,cur对应当前序列。 对cur从低位到高位依次判断改变位值后是否为新的序列,如是则加入set,并更新cur。如已存在则继续判定更高位。如果所有位的改变都不能产生新的序列,则结束。我只能说这是个"笨方法"了,在没有更好的方法之前。[cpp] view转载 2014-03-27 21:56:07 · 651 阅读 · 0 评论 -
LeetCode - Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…You must do this in-place without altering the nodes' values.For example,Given {1,2,3,4}, reorder it to原创 2014-04-16 22:36:43 · 591 阅读 · 0 评论 -
LeetCode - Implement strStr()
class Solution {public: void get_next(char* T,int *next) { int i,j; i=0; j=-1; next[0]=-1; int原创 2014-04-17 09:32:11 · 633 阅读 · 0 评论 -
求数组的子数组之和的最大值
例子:[1, -2, 3, 5, -3, 2] 返回:8[0, -2, 3, 5, -1, 2] 返回:9[-9, -2, -3, -5, -3] 返回:-2一个有N个元素的整型数组arr,有正有负,数组中连续一个或多个元素组成一个子数组,这个数组当然有很多子数组,求子数组之和的最大值。例如:[0,-2,3,5,-1,2]应返回9,[-9,-2,-3,-5,-3]应返回-2转载 2014-03-01 22:45:23 · 755 阅读 · 0 评论 -
二维子数组之和的最大值
1. 求二维数组(矩阵)的子矩阵之和的最大值。扩展问题:1. 收尾相连后,就只能上下确定边界,然后按照一维的解法进行求解。2. 上下也相连,就要两个方向都按照首尾相邻的情况考虑了。3、4. 三维和四维的情况,至少可以先在两个方向上遍历,在另一方向上先求和再按一维情况求解吧。2. 求三维数组(长方体)的子方体之和的最大值。转载 2014-03-01 22:58:19 · 838 阅读 · 0 评论 -
快速寻找满足条件的两个数
能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解。转载 2014-03-01 22:09:38 · 683 阅读 · 0 评论 -
不要被阶乘吓倒
问题1:N的阶乘中末尾有几个0:考虑对N!进行质因数分解,N!=(2^x)×(3^y)×(5^z)…,由于10 = 2×5,所以M只跟X和Z相关,每一对2和5相乘可以得到一个10,于是M = min(X, Z)。不难看出X大于等于Z,因为能被2整除的数出现的频率比能被5整除的数高得多,所以把公式简化为M = Z。其实也就是求N的阶乘中因式分解中5的指数。解法1:ret = 0;原创 2014-02-25 12:49:57 · 713 阅读 · 0 评论 -
寻找发帖“水王”
题目:Tango是微软亚洲研究院的一个试验项目。研究院的员工和实习生们都很喜欢在Tango上面交流灌水。传说,Tango有一大“水王”,他不但喜欢发贴,还会回复其他ID发的每个帖子。坊间风闻该“水王”发帖数目超过了帖子总数的一半。如果你有一个当前论坛上所有帖子(包括回帖)的列表,其中帖子作者的ID也在表中,你能快速找出这个传说中的Tango水王吗?解法1:对所有ID排序,因为该ID原创 2014-02-25 13:13:57 · 851 阅读 · 0 评论 -
1的个数
问题:给定一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数。例如:N= 2,写下1,2。这样只出现了1个“1”。N= 12,我们会写下1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12。这样,1的个数是5。问题是:1. 写一个函数f(N),返回1到N之间出现的“1”的个转载 2014-02-25 16:25:08 · 1519 阅读 · 0 评论 -
2亿个整数中求最大的100万之和
2亿个整数中求最大的100万之和题目:有一个文件中保存了2亿个整数,每个整数都以' '分隔。求最大的100万个整数之和。算法:1. 首先建立一个容量为100万(nTop)的int数组,从文件读取整数填充。2. 利用堆维护该100万条记录(确保堆顶元素为最小值)3. 从文件中读取一个整数与堆顶元素比较,如果大于堆顶元素则替换该元素,并调整堆的结构。4. 重复步骤3一直转载 2014-02-25 18:21:51 · 666 阅读 · 0 评论 -
寻找最大的k个数
题目描述:输入n个整数,输出其中最大的k个。举例:输入序列1、2、3、4、5、6、7、8,输出最大的4个数字为5、6、7、8。可能存在的条件限制:要求 时间 和 空间消耗最小、海量数据、待排序的数据可能是浮点数等方法一:对所有元素进行排序,之后取出前K个元素,不提倡使用思路:使用最快排序算法,选择快排 或 堆排时间复杂度:O(n*logn) + O(转载 2014-02-25 18:20:20 · 850 阅读 · 0 评论 -
精确表达浮点数
题目:在计算机中,使用float或者double来存储小数是不能得到精确值的。如果你希望得到精确计算结果,最好是用分数形式来表示小数。有限小数或者无限循环小数都可以转化为分数。比如:0.9 = 9/100.333(3)= 1/3(括号中的数字表示是循环节)当然一个小数可以用好几种分数形式来表示。如:0.333(3)= 1/3 = 3/9给定一个有限小数或者无原创 2014-02-26 14:53:37 · 649 阅读 · 0 评论 -
最大公约数问题
问题:最大公约数问题 写一个程序,求两个正整数的最大公约数。如果两个正整数都很大,有什么简单的算法吗? 例如,给定两个数1 100 100 210 001,, 120 200 021,求出其最大公约数。 求最大公约数是一个很基本的问题。早在公元前300年左右,欧几里得就在他的著作《几何原本》中给出了高效的解法———辗转相除法。辗转相除法的原理很聪明也很简单,假设用f(x,y)表示x与y的最原创 2014-02-26 15:07:39 · 1010 阅读 · 0 评论 -
找符合条件的整数
任意给定一个正整数N,求一个最小的正整数M(M >1),使得N * M的十进制表示形式里只含有1和0。解法1:看了题目要求之后,我们的第一想法就是从小到大枚举M的取值,然后再计算N * M,最后判断它们的乘积是否只含有1和0。大体的思路可以用下面的伪代码来实现:for(M = 2; ; M++){ product = N * M; if(原创 2014-02-27 10:27:23 · 1147 阅读 · 0 评论 -
斐波那契(Fibonacci)数列
以下取自《编程之美-微软技术面试心得》斐波那契数列由如下递推关系式定义:F(0)=0 F(1)=1F(n)=F(n-1)+F(n-2) if n>1求解斐波那契数列的方法有以下几种:1.根据递推公式可以很容易想到用递归的方法求解第n+1项的值,代码如下:int Fibonacci(int n){ if(n else原创 2014-02-27 11:39:43 · 1338 阅读 · 0 评论 -
寻找数组中 的最大值最小值
最简单的方法就是N中的每个数分别和max,min比较,看似2N次比较,其实大于max的就不必和min比较,小于min的也不必和max比较,因此比较的次数不足2N次,程序如下:[cpp] view plaincopybool MaxMin(std::vector array, T* max, T* min) { if (array.size() return fal转载 2014-02-27 12:44:13 · 1345 阅读 · 0 评论 -
寻找最近点对(POJ 3714)
网上搜了一些讲解,下边这个感觉比较清晰:讲解:http://www.cnblogs.com/king1302217/archive/2010/07/08/1773413.html 在二维平面上的n个点中,如何快速的找出最近的一对点,就是最近点对问题。 一种简单的想法是暴力枚举每两个点,记录最小距离,显然,时间复杂度为O(n^2)。 在这里介绍一种时间复转载 2014-03-01 21:56:44 · 1528 阅读 · 0 评论 -
子数组的最大乘积
题目: 给定一个长度为N的整数数组,只允许使用乘法,不能用除法,计算任意N-1个数的组合中乘积中最大的一组,并写出算法的时间复杂度。 解法: 实际上第一反应就是先将N个数相乘得到结果,然后遍历每一个数,看去掉哪个数最适合,注意正负号。效率O(N). 但是文章在最后指出不允许用除法的用意是这样的,乘法很容易溢出。意思是干脆乘法也不要用。转载 2014-03-01 22:28:16 · 866 阅读 · 0 评论 -
leetcode --n皇后
今天刷leetcode时,碰到了n皇后问题,上网发下了一个非常给力的算法。算法的核心:使用bit数组来代替以前由int或者bool数组来存储当前格子被占用或者说可用信息,从这可以看出N个皇后对应需要N位表示。巧妙之处在于:以前我们需要在一个N*N正方形的网格中挪动皇后来进行试探回溯,每走一步都要观察和记录一个格子前后左右对角线上格子的信息;采用bit位进行信息存储的话,就可原创 2014-03-25 00:35:08 · 729 阅读 · 0 评论