Algorithm笔试
文章平均质量分 83
共勉
这个作者很懒,什么都没留下…
展开
-
在一个字符串中找到第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入a1bacc1#¥2d7eff,则输出b。 分析:这道题是2006年google的一道笔试题。 看到这道题时,最直观的想法是从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(转载 2015-03-30 15:30:09 · 501 阅读 · 0 评论 -
剑指offer 面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当ia[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。参考文献转载 2015-04-29 20:32:12 · 394 阅读 · 0 评论 -
递归应用——字符串全排列,字符串组合
来源http://blog.csdn.net/wuzhekai1985问题1 :输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 思路:这是个递归求解的问题。递归算法有四个特性:(1)必须有可达到的终止条件,否则程序将陷入死循环;(2)子问题在规模上比原问题小;转载 2015-04-28 09:35:54 · 513 阅读 · 0 评论 -
面试_单链表操作试题_汇总
一、单链表结点的删除0、删除单链表p指向的那个元素,(时间和空间复杂度尽量小)二、单链表的存取1、找出单链表的倒数第K个元素,(仅允许遍历一遍链表)2、找出单链表的中间元素,(仅允许遍历一遍链表)三、单链表与环的问题3、判断单链表是否有环(6形状)?4、如何找到环的入口?5、如何知道环的长度?6、带环链表的转载 2015-04-22 20:45:37 · 381 阅读 · 0 评论 -
1.用两个栈实现队列 2.用两个队列实现一个栈
1.用两个栈实现队列编程思想:添加元素全都放入栈sta,出栈元素都从栈stb退出。当stb非空时,直接进行元素出栈实现队列。只有在栈stb为空,且sta非空的情况下,将sta中所有的元素一次性加入stb,(stb为空,sta为空,队列空)再进行元素出栈。Quene核心代码void appendTail( ElementType data)//入队 {原创 2015-04-23 15:53:43 · 615 阅读 · 0 评论 -
希尔排序
希尔排序(Shell Sort)是插入排序的一种。因D.L.Shell于1959年提出而得名。一、基本思想 对待排记录序列先作“宏观”调整,再作“微观”调整。 所谓“宏观”调整,指的是 “跳跃式”的插入排序。即:将记录序列分成若干子序列,每个子序列分别进行插入排序。关键是,这种子序列不是由相邻的记录构成的。假设将n个记录分成d个子序列,则这d个子序列分别为:转载 2015-04-01 19:42:43 · 457 阅读 · 0 评论 -
快速排序
快速排序是C.R.A.Hoare于1962年提出的一种分区交换排序。它采用了一种分治法(Divide-and-ConquerMethod)策略,分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。快速排序是目前己知的平均速度最快的一种排序方法。一、基本思想 快速排序方法的基本思想是:从待排序的n转载 2015-04-01 15:43:37 · 593 阅读 · 0 评论 -
一致性哈希算法(consistent hashing)
转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179 一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到转载 2015-11-05 22:45:32 · 369 阅读 · 0 评论 -
插入排序
直接插入排序折半插入排序二路插入排序表排序希尔排序插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的数据序列的适当位置,直到全部记录插入完成为止。一、基本思想 假设待排序的记录存放在数组R[0…n-1]中。初始时,R[0]自成1个有序区,无序区为R[1…n-1]。从i=1起直至i= n-1为止,依次将R[i]插入转载 2015-04-01 17:24:15 · 478 阅读 · 0 评论 -
选择排序
选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的记录序列的最后,直到全部记录排序完毕。一、基本思想 选择排序是一种简单且直观的排序方法。选择排序的做法是:从待排序的记录序列中选择关键码最小(或最大)的记录并将它与序列中的第一个记录交换位置;然后从不包括第一个位置上的记录序列中选择关键码最小(或最大)的记录并将它与序列中的转载 2015-04-01 16:51:01 · 741 阅读 · 0 评论 -
归并排序
对于排序大列表数据,一个有效的排序算法是归并排序。类似于快速排序算法,其使用的是分治法来排序。归并排序的基本思想是:将两个或两个以上的有序子序列”归并”为一个有序序列。在内部排序中,通常采用的是2-路归并排序。即:将两个位置相邻的有序子序列“归并”为一个有序序列。算法描述归并操作的工作原理如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两转载 2015-04-01 22:02:00 · 663 阅读 · 0 评论 -
冒泡排序
基本概念 冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。至此第一趟结束,将最大的数放到了最后。在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数转载 2015-04-01 16:41:55 · 377 阅读 · 0 评论 -
堆排序
堆排序 堆排序是利用堆的性质进行的一种选择排序。下面先讨论一下堆。1.堆 堆实际上是一棵完全二叉树,其任何一非叶节点满足性质: Key[i]=Key[2i+1]&&key>=key[2i+2] 即任何一非叶节点的关键字不大于或者不小于其左右孩子节点的关键字。 堆分为大顶堆和小顶堆,满足Key[i]>=Key[2i+1]&&key>=key[2i+2]称为转载 2015-04-01 20:34:02 · 631 阅读 · 0 评论 -
寻找一个字符串中连续出现次数最多的子串
首先要搞清楚题目关于子串的概念。1.一个字符当然也算自串。而题目要求连续出现次数最多的子串。如:abcbcbcabc,连续出现次数最多的子串是bc,连续出现三次。 abcccabc,连续出现次数最多的子串是c,连续出现三次。算法描述首先获得后缀数组:a b c b c b c a b c .substr[0]b c b c b c转载 2015-04-07 13:30:07 · 882 阅读 · 0 评论 -
典型的Top K算法 _找出一个数组里面前K个最大数_找出1亿个浮点数中最大的10000个_一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入内存.
Top K 算法详解应用场景: 搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的长度为1-255字节。 假设目前有一千万个记录(这些查询串的重复度比较高,虽然总数是1千万,但如果除去重复后,不超过3百万个。一个查询串的重复度越高,说明查询它的用户越多,也就是越热门。),请你统计最热门的10个查询串,要求使用的内存不能超过1G。转载 2015-04-10 22:10:10 · 3211 阅读 · 0 评论 -
求字符串中最长无重复字符的子串
转载自http://www.cnblogs.com/luxiaoxun/archive/2012/10/05/2712131.html特此感谢楼主,仅作笔记使用后缀数组--处理字符串的利器后缀数组是处理字符串的有力工具。后缀数组是后缀树的一个非常精巧的替代品,它比后缀树容易编程实现,能够实现后缀树的很多功能而时间复杂度也并不逊色,而且它比后缀树所占用的内存空转载 2015-12-07 11:30:33 · 524 阅读 · 0 评论 -
编程之美2.14 求子数组和的最大值(首尾相连)
整体思路:问题的解可以分为两种情况:1)解没有跨过A[n-1]到A[0],即普通的求子数组和的最大值2)解跨过A[n-1]到A[0]对第二种情况,只要找到从A[0]开始求和的最大的一段(A[0],...,A[j])(0那么第2种情况中,和的最大值M_2为:M_2=A[i]+...+A[n-1] + A[0] +...+ A[j]如果iM_2=A[0原创 2015-04-20 22:15:30 · 462 阅读 · 0 评论 -
剑指offer ——寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数转载 2015-03-31 16:33:21 · 400 阅读 · 0 评论 -
百度一道笔试题(求n个整数连成一排组成的最小整数)
// LeastNumber.cpp : 定义控制台应用程序的入口点。 //09百度笔试试题,设有n个正整数,将它们连接成一排,组成一个最小的多位数。 //程序输入:n个数 输出:连接成的多位数 //例如:n=4时,4个整数55,31,312,33 输出:312 31 33 55 //解法思想:题目可转化为排序问题,只不过是比较方法与普通排序不同,这个排序中转载 2015-03-29 20:14:43 · 2567 阅读 · 0 评论 -
华为笔试—在字符串A中删除字符串B中的全部字符
例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。思路:不可避免的是遍历第一个字符串,如果遍历一个字符,都需要去第二个字符串中查找其存不存在,那么复杂度会是O(nm),当然由于字符数有限,所以m是个常量。关于查找速度最快的当然是hash表,对于8位字符,size=2^8足矣。关于删除字符,后面的字符要往前转载 2015-03-31 15:56:35 · 1674 阅读 · 0 评论 -
输入一个链表的头结点,从尾到头反过来输出每个结点的值
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。看到这道题后,第一反应是从头到尾输出比较简单。于是很自然地想到把链表中链接结点的转载 2015-03-31 14:01:04 · 811 阅读 · 0 评论 -
腾讯笔试 求基因碱基的逆序数
已知碱基序列ACGT为正序。求任意碱基序列的逆序数。要求算法的时间复杂度为o(n).如:一序列为 AGTCTCG 则其逆序数为7。#includeusing namespace std;int reserveNumber(char *pdna);int main() { char str[]="ACTCTGA"; cout原创 2015-03-31 13:18:41 · 662 阅读 · 0 评论 -
数据结构 常用的算法的时间复杂度和空间复杂度
转载 2015-04-01 15:42:57 · 730 阅读 · 0 评论 -
100阶乘末尾有多少个零
100阶乘末尾有多少个零 题目:1*2*3*……*100 求结果末尾有多少个零 阶乘末尾一个零,相当于乘以10。 而10 是由2*5所得,我们知道任意一个偶数都含有2,所以2的个数比5多很多,所以只要找0-100中含有5的数的个数就行了。1、 每隔5个,会产生一个0,比如 5, 10 ,15,20.。。 100/5=2原创 2015-04-03 15:15:45 · 1100 阅读 · 1 评论 -
斐波那契数列的几种计算机解法
斐波那契数列传说起源于一对非常会生的兔子。定义:这个数列有很多奇妙的性质(比如 F(n+1)/F(n) 的极限是黄金分割率),用计算机有效地求解这个问题的解是一个比较有意思的问题,本文一共提供了4种解法。解法一:递归这是最最最直观的想法,是每个人都能编写的简单程序,优点是非常明显的:简单易懂,清晰明了。但是缺点就是效率非常低,时间复杂度是指数级的。举转载 2015-04-18 20:11:46 · 570 阅读 · 0 评论 -
n个元素顺序进栈,那么出栈的顺序有多少种?
我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 f(2) = 2 f(3) = 5 然后我们来考虑f(4), 我们给4个元素编号为1,2,3,4, 那么考虑:元素1出栈顺序可能出现在1号位置,2号位置,3号位置和4号位置(很容易理解,一共就4个位置,比如1234,元素1就在1号位置)。 分析: 1) 如果元素1在1号位置,那么只可原创 2015-04-18 21:38:26 · 5858 阅读 · 1 评论 -
【编程之美】2.4从1到N中1出现的数目----出现任意一个数的个数。
题目描述:给定一个十进制整数N,写出从1开始到N的所有整数,统计一下其中出现所有“1”的个数。例如12,一共有1、10、11、12四个数中出现5次1。问:1、写出一个函数,返回1到N之间出现1的次数2、满足条件f(N) = N 的最大的N是多少。题目解析:思路一:我们用粗暴的方式,要求1的个数,那么我们就跟二进转载 2015-04-19 22:07:49 · 546 阅读 · 0 评论 -
判断字符串及其子串是否是包含回文字,如果包含输出长度。
例如:str=helloworld 输出 3 (owo)注:回文串有两种 类型: 类型一、abcba 类型二、abccba算法思想:为从第二个元素开始顺序遍历字符串。1.查看第i个字符是否和第i-1个相等,相等符合类型二 处理。2.如果1不满足在查看i两边元素是否相等,相等符合类型一,否则i++。代码如下:#include#includeu原创 2015-04-19 13:30:36 · 556 阅读 · 0 评论 -
编程之美2.12——快速寻找满足条件的两个数。(拓展满足条件的多个数)
前奏希望此编程艺术系列能给各位带来的是一种方法,一种创造力,一种举一反三的能力。本章依然同第四章一样,选取比较简单的面试题,恭祝各位旅途愉快。同样,有任何问题,欢迎不吝指正。谢谢。第一节、寻找满足条件的两个数第14题(数组):题目:输入一个数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输转载 2015-04-20 17:29:36 · 712 阅读 · 0 评论 -
编程之美2.12——快速寻找满足条件的两个数或三个数
问题:1. 快速找出一个数组中的两个数,让这两个数之和等于一个给定的值。2. 快速找出一个数组中的三个数,让这三个数之和等于一个给定的值。1. 解法:先用快速排序对数组排序O(nlogn),让后用双指针(双索引)法对排序好的数组进行反向遍历,并且遍历的方向不变。(若是计算两个数的和,则初始化为i=0,j=n-1,若是计算两个数的差,则初始化为i=0,j=1)转载 2015-04-20 19:27:36 · 437 阅读 · 0 评论 -
判断字符串d是否是字符串s关于栈的输出序列
由栈的输入输出过程可得一下规律: 如果下一个弹出的数字刚好是栈顶的数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压栈,直到把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈,但是仍然没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。代码如下:#include#includeusing namespace std;原创 2015-04-25 16:29:01 · 555 阅读 · 0 评论 -
实现一个包含Min,Max函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1).注:如果每次都把最小元素压入辅助栈,那么就能保证辅助栈的栈顶一直都是最小元素。当最小元素从数据栈内被弹出之后,同时弹出辅助栈的 栈顶元素,此时辅助栈的新栈顶元素就是下一个最小值。 m_data是数据栈,m_min是辅助栈。vo原创 2015-04-25 11:50:15 · 1137 阅读 · 0 评论 -
Windows 下MSYS、MinGW、Cgywin使用gcc区别
一、 在Windows下比较流行的GCC移植版主要有三个。他们是 MinGW,Cygwin和Djgpp。1.MinGW 的主要方向是让GCC的Windows移植版能使用Win32API来编程。(使用Win32API的代码可用MinGW的gcc编译,有点像用Linux开发环境开发Windows程序 如果你只是想在windows下使用gcc编译器也不想依赖其他的dll,ming转载 2016-02-25 11:22:58 · 4780 阅读 · 0 评论