算法
文章平均质量分 70
cool_bomb
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
最长公共子序列问题(动态规划法)
---------------------------动态规划的介绍----------------- 什么是动态规划:动态规划是一种通过把原问题分解成简单的子问题来求解复杂的问题的方法。 动态规划的适用范围:适用于具有重叠子问题和最有子结构性质的问题。一下是关于使用范围的具体解释。 重叠子问题:动态规划只解决子问题一次,并且将解决的子问题进行存储,当下次需要转载 2013-01-13 14:53:46 · 865 阅读 · 0 评论 -
外部排序
对于大数据来说内存远远不够的,所以要进行排序时待排序的记录存储在外存储器上面了,而待排序的文件无法一次性全部装入内存,需要一点点的在内存和外部存储器之间进行交换,以此达到整个文件排序的目的。外部排序最常用的算法是多路归并排序,将待排序的源文一次分解成多个小文件,这些小文件单个都能装入内存,然后分别把每一部分调入文件进行排序。然后对已经排好序的各个小文件进行归并排序。 如果不能将两原创 2013-01-13 14:57:40 · 759 阅读 · 0 评论 -
求数组的子数组之和的最大值
转自:http://blog.youkuaiyun.com/v_JULY_v/article/details/6444021题目描述:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 1转载 2013-01-29 21:05:10 · 434 阅读 · 0 评论 -
Data Structures and Algorithm面试笔试题
from http://superonion.iteye.com/blog/1522199本篇收录了本人亲身经历的各大公司最新Data Structures and Algorithm面试笔试题及解题思路,持续更新,欢迎补充。 1. 给定一个单词a,如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的兄弟单词,例如单词army和mary互为兄弟单词。现在给定一转载 2013-01-29 21:36:00 · 627 阅读 · 0 评论 -
查找第K小的元素
from http://www.isnowfy.com/top-k-number/感觉这是个经典问题了,但是今天看维基百科的时候还是有了新的发现,话说这个问题,比较挫的解决方案有先排序,然后找到第K小的,复杂度是O(nlogn),还有就是利用选择排序或者是堆排序来搞,选择排序是O(kn),堆排序是O(nlogk),比较好的解决方案是利用类似快速排序的思想来找到第K小,复杂度为O转载 2013-01-30 23:32:24 · 479 阅读 · 0 评论 -
数组中出现次数超过一半的数字
http://blog.163.com/xie_wenbin613/blog/static/175489095201242625851399/题目:数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字。 分析: 1.首先我们想到如果是一个排序好的数组,那么我们只需要遍历一次数组,统计好每个数字出现的次数,如果大于数组长度的一半就输出这个数字。或者只需要直接输出转载 2013-01-30 23:39:03 · 452 阅读 · 0 评论 -
数组分割
一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:S(k, 1) = {A[i] | 1S(k, k) = {A[1]+A[2]+…+A[k]}S(k, i) = S(转载 2013-01-30 23:46:08 · 440 阅读 · 0 评论 -
快速找到未知长度单链表的中间节点
http://blog.fishc.com/1936.html 题目:快速找到未知长度单链表的中间节点。既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为:O(L+L/2)=O(3L/2)。 能否再优化一下这个时间复杂度呢?转载 2013-01-30 23:50:47 · 3234 阅读 · 0 评论 -
如何测试洗牌程序
http://jaring.me/?p=1081我希望本文有助于你了解测试软件是一件很重要也是一件不简单的事。我们有一个程序,叫ShuffleArray(),是用来洗牌的,我见过N多千变万化的ShuffleArray(),但是似乎从来没人去想过怎么去测试这个算法。所以,我在面试中我经常会问应聘者如何测试ShuffleArray(),没想到这个问题居然难倒了很多有多年编程经验的人转载 2013-01-30 23:52:57 · 587 阅读 · 0 评论 -
子数组之和的最大值
http://blog.youkuaiyun.com/songjiano/article/details/6594616给定一个数组,查找这个数组的子数组的最大和比如{-2,5,3,-6,4,-8,6}输出最大和8分析:假设已经找到一个子数组的最大和,这个子数组是从数组索引i到索引j。可以用如下式子描述,cur_max = a[i , j]; 对于下一个转载 2013-02-08 21:50:33 · 525 阅读 · 0 评论 -
数组分割
http://www.cnblogs.com/freewater/archive/2012/08/23/2652974.html本文说是《编程之美》2.18新思路,其实也是July的《微软等公司面试100题》上的32题的解法。 两个序列大小均为n,序列元素的值为任一整数,无序;要求通过交换两个序列的元素,使序列a元素之和与序列b的元素之和的差最小(可能存在很多种转载 2013-02-07 22:12:08 · 583 阅读 · 0 评论 -
数组分割
一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。显然:S(k, 1) = {A[i] | 1S(k, k) = {A[1]+A[2]+…+A[k]}S(k, i) = S(转载 2013-02-07 22:15:25 · 421 阅读 · 0 评论 -
合并两个排序链表
首先,讲一下对于两个已排序链表的合并。源码如下:首先定义链表节点node,用于保存数据data和下一个节点next: [cpp] view plaincopystruct node { int data; struct node *next; }; 然后对两个已排序链表进行合并,返回合并好的链表:转载 2013-02-10 20:38:00 · 399 阅读 · 0 评论 -
bitmap应用及C语言实现
http://blog.chinaunix.net/uid-22663647-id-1771837.htmlbitmap是一个十分有用的结构。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素。由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省。如果说了这么多还没明白什么是Bit-map,那么我们来看一个具体的例子,假设我们要转载 2013-02-10 21:08:39 · 2885 阅读 · 1 评论 -
数组元素交叉排列的算法题(a1 a2 a3 .. an b1 b2 b3 .. bn -->a 1 b1, a2 b2, a3 b3, .. an bn )
题目:给定整数数组,元素为a1 a2 a3 .. an b1 b2 b3 .. bn元素个数为 2n要求:请生成如下数组,a1 b1, a2 b2, a3 b3, .. an bn. 条件:时间复杂度为O(N),空间复杂度为O(1).来源:http://topic.youkuaiyun.com/u/20100623/09/dd25166f-bac4-4b2d-98ab-71cab69f转载 2013-02-14 00:51:45 · 991 阅读 · 0 评论 -
从字符串中删除重复的字符
设计一个算法去移除字符串中重复的字符,但是只可以使用一个或两个变量的额外空间。 Design an algorithm and write code to remove the duplicate characters in astring without using any additional buffer. NOTE: One or two additional variables翻译 2013-02-15 02:01:43 · 1033 阅读 · 0 评论 -
大数相乘算法
http://xue23.blog.163.com/blog/static/979344200621814470/假设有两个大数A,B。Ai表示为A的i位数,Bj表示为B的j位数。相乘后的结果为C,C是一系列数的集合,其成员的大小为0-81, Zk表示为Z的第k个数。注意这里说的是第K个数,不是Z的第K位。为什么Zk大小是0-81呢,因为Ai的大小是0-9,Bj的大小为0-9。Ai*B转载 2013-02-10 19:59:44 · 772 阅读 · 0 评论 -
读取文件的最后十行
使用c设计一个方法去打印输出文件的最后十行5.2 Write a method to print the last ten lines of an input file using C.SOLUTION比较笨的办法是记录文件的行数,然后打印最后十行。但是如果文件很大,两次读取文件很费时。所以我们可以用数组存储读取的行数,先读取十行,这时当读取新的一行时将第一个元素覆盖,再读取一翻译 2013-02-12 06:13:22 · 1074 阅读 · 0 评论 -
改进的筛素数法
http://blog.youkuaiyun.com/morewindows/article/details/7347459最简单的筛素数法方法就是从2开始,将所以2的倍数去掉,然后从3开始,将3的倍数去掉。根据这样很容易写出代码,下面代码就是是筛素数法得到100以内的素数并保存到primes[]数组中。[cpp] view plaincopy//b转载 2013-02-15 22:23:06 · 509 阅读 · 0 评论 -
几种简单的判断素数的方法
http://hi.baidu.com/hking1987/item/648ca019743efb7f7a5f25e7几种简单的判断素数的方法素数还有很多东西需要学,先整理三种最简单的判断素数的方法,以后再深究补充。判断n是否为素数1、最简单的方法用n除以2-sqrt(n),有一个能除尽就不是素数,否则是素数。因为m的一个因子如果大于根号m,那这个数必定转载 2013-02-16 00:30:02 · 8347 阅读 · 0 评论 -
分解质因数
定义:一个数如果只能被他本身和1整除,那么他就是质因数。质因数分解:一个数如果不是质数就是非质数,非质数可以分解为比他小的质数的乘积。首先判断一个数是否是质数,如果是合数,则进行分解。合数可以分解为非递减的素数相乘的乘积,所以首先要找出小于这个合数的素数。找出素数可以用改进的筛素数法。但是求出全部小于要分解的合数的所有素数没有必要,可以先求一个素数为i,当n%i != 0时原创 2013-02-16 02:44:10 · 824 阅读 · 0 评论 -
找出数组中缺失的数
从数组0到n之间的整数拿掉一个,其余的数为数组A[1...n]的元素。由于A的元素以bit表示,所以不能一次获得A的整个元素。唯一能做的是取得A[i]的第j个bit。An array A[1...n] contains all the integers from 0 to n except for one numberwhich is missing. In this proble翻译 2013-02-17 01:16:25 · 2608 阅读 · 0 评论 -
计算一个无符整数中1Bit的个数(1)
http://blog.chinaunix.net/uid-21275705-id-224360.htmlCount the number of bits that are on in an unsigned integer(计算一个无符整数中1Bit的个数)-- (1)计算一个无符号整数中有多少的Bit为1这是一个经常遇到的经典问题,这里分两个部分讲解和总结,首先对讲解现转载 2013-02-17 16:22:42 · 687 阅读 · 0 评论 -
在给定的数组中找出两个元素和为给定值的所有元素对
Design an algorithm to find all pairs of integers within an array which sum toa specified value. 使用hash map:1假设V为给定的值,A为给定的数组。2创建hash map M,M将从数组元素映射到出现次数。3对数组中的元素A[i]:如果 V-A[i] 在M中,翻译 2013-02-16 23:15:16 · 1847 阅读 · 1 评论 -
找重复元素
http://blog.youkuaiyun.com/morewindows/article/details/8204460最近在微博上看到一道有趣的GOOGLE面试题,见下图:文字版:一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。 这个题目要求用O(n)的时转载 2013-02-10 22:58:35 · 457 阅读 · 0 评论 -
合并两个已经排序的数组
给定两个已经排序的数组A和B,A有足够大的空间去容纳B。从数组A和B的尾部遍历比较元素,大的放在数组A的后面。最后如果B中还有元素,将其加入A中。注意:不必在B中的元素遍历完后再次遍历A中的元素,因为他们已经在A中了。You are given two sorted arrays, A and B, and A has a large enough buffer at theend翻译 2013-02-17 02:14:20 · 8680 阅读 · 1 评论 -
从多次循环移位后的数组中找出特定的元素
给定有n个元素的数组,将其循环移位多次,给定一个时间复杂度为O(log n) 的算法找出特定的元素。Given a sorted array of n integers that has been rotated an unknown number oftimes, give an O(log n) algorithm that finds an element in the array.翻译 2013-02-18 20:31:55 · 779 阅读 · 0 评论 -
把数组排成最小的数
http://zhedahht.blog.163.com/blog/#m=0题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法。分析:这是09年6月份百度新鲜出炉的一道面试题,从这道题我们可以看出百度对应聘者在算法方面有很高的要求。这道题其转载 2013-03-03 14:26:05 · 532 阅读 · 0 评论 -
8皇后问题
在棋盘上去放置8个皇后,任意两个点不在同一行,同一列,同意斜线上。Find a way to arrange 8 queens on a chess board so that none of them sharethe same row, column or diagonal.此题使用回溯的解法。对于每一行,检查放置皇后的列,看这一列是否符合条件。1.为了决定哪一列放这个翻译 2013-02-18 22:17:21 · 498 阅读 · 0 评论 -
从书中查找某个单词出现的频率
设计算法,找出一本书中任一给定的词汇的频率。Design a method to find the frequency of occurrences of any given word in abook. 对于只找出一个单词的频率和找出多个单词的频率解法不同。SOLUTIONThe first question – which you should ask your i翻译 2013-02-20 20:44:43 · 1512 阅读 · 0 评论 -
url去重
有10亿个url,每一个页面都非常大。怎样删除重复的url?You have a billion urls, where each is a huge page. How do you detect theduplicate documents?1.页面巨大,所以把他们全部存入内存很费事。可以在内存中存储页面的简短表示。很明显使用hash是个好的选择。2.由于urls太多了翻译 2013-02-20 22:03:50 · 4463 阅读 · 0 评论 -
在binary search tree中查找和为k的两个元素
给定一个二叉树。找到树中的两个元素,使他们的和为k。假设树是平衡的。Given a binary tree. Find two numbers in the tree whose sum is k. If there are no such elements, state so. Assume that the tree is balanced.如果树是bst,即若它的左子树不空,则左翻译 2013-03-05 21:35:28 · 1197 阅读 · 0 评论 -
对称子字符串的最大长度
http://zhedahht.blog.163.com/blog/static/25411174201063105120425/题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。引子:判断字转载 2013-03-06 22:27:06 · 657 阅读 · 0 评论 -
后缀树的具体应用
http://www.cppblog.com/superKiki/archive/2010/10/29/131786.aspx 在pongba的讨论组上看到一道Amazon的面试题:找出给定字符串里的最长回文。例子:输入XMADAMYX。则输出MADAM。这道题的流行解法是用后缀树(Suffix Tree)。这坨数据结构最酷的地方是用它能高效解决一大票复杂的字符串编程问题:转载 2013-03-06 20:44:30 · 3590 阅读 · 0 评论 -
在BST中找到第k大的数
找出BST中第k大的数:如果中序遍历BST(左子树->根节点->右子树)可以得到从小到大的数字序列。要求第k大的元素,得到从大到小的数字序列最好了。根据前面的提示访问顺序为右子树->根节点->左子树时得到从大到小的数字序列。不过为了求取第k大的数,可以在访问完之后,将计数器自增 count++,如果count等于k输出这个数。大于k时返回错误。struct Node {原创 2013-03-06 22:14:08 · 4405 阅读 · 0 评论 -
复杂链表的复制
http://zhedahht.blog.163.com/blog/static/254111742010819104710337/题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{ int m转载 2013-03-07 20:54:39 · 654 阅读 · 0 评论 -
后缀树的构造方法-Ukkonen详解
http://blog.163.com/lazy_p/blog/static/13510721620108139476816/最近在学习后缀树的构造,在网上找了好久发觉国内详解它的构造的文章胜少,在苦苦寻觅了许久,终于发现了一个网友翻译的一篇文章,很好,于是我转帖出来,希望能有更多的人受益,也希望国内多一些英文高手多翻译一些国外的技术文章,好让我们这些英文很烂的人受益,呵呵!后缀树转载 2013-03-01 21:15:04 · 580 阅读 · 0 评论 -
数对之差的最大值
http://zhedahht.blog.163.com/题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。分析:看到这个题目,很多人的第一反应是找到这个数组的最大值和最小值,然后觉得最大值减去最小值就是最终的结果。这种思路忽略了题目中很重要的一点:转载 2013-03-03 20:08:20 · 414 阅读 · 0 评论 -
幂次方算法
求a的b次幂。比较简单的方法是a乘以a,做b次(当b为正数时)。如果b为偶数,那么a×a只要乘b/2次(减少了相乘的次数) b为奇数,a×a乘(b-1)/2次,再乘a。不考虑b为负数的情况,采用递归。private double Power(double a, int b) { if (b<0) { throw new ApplicationExcept翻译 2013-03-13 22:43:37 · 2156 阅读 · 0 评论 -
求字符串中包含唯一字符的最长子串
给你一个字符串,找到只包含唯一字符的最长子串。Given a string, find the longest sub sequence which contains only unique characters.维护两个指针,左指针和右指针。同时用一个hash表存储左右指针之间的字符以及字符出现的位置。初始化的时候:left = 0,right = 0.右指针不断的前移,同时将所指的翻译 2013-03-14 21:31:49 · 1919 阅读 · 0 评论
分享