算法
文章平均质量分 59
老胡爱分享
微信公众号【老胡爱分享】
个人主页:http://www.hoohack.me
掘金:https://juejin.im/user/577b3080a633bd005bdaed03
展开
-
你附近的人都有谁,这个功能是怎么实现的?
手机上很多软件都有附近的人的功能,比如微信的“附近的人”,美团的“附近的餐厅”等等,那么这些功能可以怎么实现呢?Redis中的Geo命令在Redis在3.2版本新增了一个功能,就是GEO...原创 2020-09-20 00:19:55 · 526 阅读 · 0 评论 -
算法学习七----在一个字符串中找到第一个只出现一次的字符
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 算法思路:此算法的实现在于选择适当的数据结构,可以选择一种叫映射表的数据结构映射表简单地说就是进化的“数组”,但是“数组”的下标可以是任意类型所以可以选择字符与数字的映射表作为数据结构,然后扫描字符串的每一个字符,如果当前字符还没有在映射表中,则添加进去映射表,并将其值设为1原创 2014-04-07 22:19:17 · 864 阅读 · 0 评论 -
算法学习二----求子数组的最大和
题目如下:输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18。注:有些题目要求的是如果序列全为负数就返回0,但原创 2014-03-26 13:36:25 · 842 阅读 · 0 评论 -
深入解析UUID及其应用
讨论UUID的定义、分类、应用及生成工具。什么是UUID?UUID是Universally Unique Identifier的缩写,它是在一定的范围内(从特定的名字空间到全球)唯一的机器生成的标识符。UUID具有以下涵义:经由一定的算法机器生成为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素转载 2014-05-07 20:47:31 · 36225 阅读 · 1 评论 -
算法学习八----约瑟夫问题
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。经典的算法题目算法思路:采用循环链表的数据结构1、初始当前位置为链表第一个元素2、从当前位置开始,向前移动n-1原创 2014-04-08 09:51:31 · 659 阅读 · 0 评论 -
算法学习九----在从1到n的正数中1出现的次数
题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。要在一个数字中找到1的个数,可以简单地把数字转换成字符串,然后扫描字符串,判断每个字符是否为1,如果为1就把1的个数加1.另一种解法是通过除法和取模判断1的个数。首先,当数字为1位数时,将其除以10取模,然后判断是否原创 2014-04-09 09:49:45 · 811 阅读 · 0 评论 -
算法学习一----设计包含min函数的栈
这学期大三了,身边的同学都在准备找实习了,就业压力挺大的说,最近为了准备求职的笔试,很长时间都没有写博客了。最近都在学习C++和数据结构,现在接触算法,以前算法课堂没有好好上,只是把实验题做了就一了百了,没有大的提升,所以现在想在准备笔试的时候把算法好好的补一补,于是在这里记录自己的学习过程。今天学习了一个挺有趣的算法,是微软面试100题中的题目。题目如下:设计包含mi原创 2014-03-25 15:39:23 · 917 阅读 · 0 评论 -
并行快速排序
并行快速排序感谢网友浅水清流投递本稿。并发算法是多核时代开始流行的技术趋势,比如tbb,ppl都提供了大量有用的并发算法。经典算法中,排序是一个很适合采用分治法并发的场合,比如快速排序。常规的快速排序,先在数组中选取一个基准点,将数组分区为小于基准点和大于基准点(相同的数可以到任一边),对分区的子数组递归的执行分区的操作,当子数组长度为1时退出递归。此时数组就完转载 2014-04-09 16:10:45 · 6245 阅读 · 0 评论 -
算法学习十----整数的二进制表示中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。这是一道考查位运算的题目,做位运算的时候一定要把负数也考虑进去,刚开始做的时候忘了考虑进去,结果输入一个负数的时候就彻底凌乱了。刚开始的思路是先判断整数的最右边一位是不是1,然后把整数右移一位,这样,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这原创 2014-04-10 15:21:05 · 787 阅读 · 0 评论 -
算法学习十一----连续最长的数字串
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,outputstr所指的值为1原创 2014-04-13 11:21:02 · 943 阅读 · 0 评论 -
算法学习十八----寻找发帖水王
题目:经常在论坛或者讨论区上面会看到一些人每个帖子都回复或者发了很多帖子(但是没有对其他用户有用途的)。现在写一个算法,找出发帖数目超过帖子总数的一半的用户ID--称为发帖水王。(注:本题假设发帖水王存在)算法思路如下:先对序列排序之后,计算出每个ID的次数,输出出现次数最大的用户ID即可。但是这个方法效率比较低。另一种方法,就是想办法将大问题转换成小问题,对列表进行扫描,每次删除原创 2014-05-19 18:19:39 · 1373 阅读 · 0 评论 -
算法学习六----数组中查找两个数,使得它们的和正好是输入的那个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。算法思路:如果不考虑复杂度,可以用两个循环遍历该数组,第一个循环先拿一个数a出来,然后第二个循环中的原创 2014-04-06 17:26:55 · 1205 阅读 · 0 评论 -
算法学习十六----求最大公约数
题目:求最大公约数用辗转相除法求最大公约数的解法相信大家都很熟悉,就是用大数除以小数,然后取出余数与之前较小的数再递归地进行同样的操作,直到其中一个数为0。但是这样的除法在遇到大整数的时候作除法非常地耗时,这样对效率方面有很大的影响。设两个数为x,y采用辗转相除法的分析,如果一个数能够同时正处x和y,则必能同时整除x-y和y;而能够同时整除x-y和y的数也必能同时整原创 2014-04-21 13:46:47 · 1205 阅读 · 0 评论 -
算法学习十五----找数组最大值和最小值
题目:给定一个数组,找出数组中的最大值和最小值算法思路一:使用两个“游标”,p代表最大值,q代表最小值,初始为数组的第一个和第二个,不断向后移并且做比较,每次移动时将较大值与p比较,将p赋为较大值,较小值也同理。这样就能找到最大值和最小值。此算法要注意的地方就是当数组只有一个元素以及数组的个数为奇数个时要做另外的处理算法伪代码如下:if array.size = 1then原创 2014-04-20 10:01:25 · 7341 阅读 · 0 评论 -
经典排序算法之快速排序
现在讨论一个借助“交换”实现排序的方法。主要有冒泡排序和快速排序(考虑从小到大的顺序)。交换的意思是只在记录里面发生交换,而不借助其他的辅助空间进行存储以达到交换的目的。一、冒泡排序冒泡排序的过程都为大家所熟知,主要的思想是:1)将第一个记录与第二个记录作比较,如果第一个记录的大小比第二个大,则将两个记录交换,然后比较第二个记录与第三个记录。直到第n-1个记录与第n个记录进行完比较原创 2012-11-22 20:28:06 · 610 阅读 · 0 评论 -
经典排序算法之归并排序
归并排序的原理跟快速排序中的分治策略类似。它的思想是将一个待排的序列分成很多个大小为1的序列,然后分别对这些序列进行排序,然后将排好的序列合并。然后再对合并后的序列再进行合并排序,直到合并后的表的大小跟原来的大小一样为止。下面是归并排序的算法思想:1)拆分序列,将其分成n个序列;2)合并序列,第一步先将其合并成n/2个序列,然后在这基础上重复,直到得到一个大小为n的序列;下面是归并原创 2012-11-22 21:05:37 · 584 阅读 · 0 评论 -
爱心网站笔记(六)
play注解@Required (message="Userid'length must more than 12") @MinSize (value=12,message="Userid'length must more than 12") String useridRequired 注解是说明此参数是必须输入的,如果没有输入的话程序会检测到错误。message参数是出现错误的时原创 2013-06-04 20:18:00 · 747 阅读 · 0 评论 -
算法学习三----句子单词反转
题目要求:反转句子中单词的顺序题目:输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字符一样处理。例如输入“I am a student.”,则输出“student. a am I”此算法可以结合栈的数据结构实现,分割每个单词,一个个放入栈中,然后再一个个弹出即可。下面是此算法的伪代码:原创 2014-03-28 19:46:17 · 1454 阅读 · 0 评论 -
算法学习四----计算1-n
题目:求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。不能用循环,但是循环只是让相同的代码执行n遍,所以采用了新建一个类,类里面有静态变量,然后用该类创建一个对象数组,这样该类就被初始化了n次,每次都对该静态变量进行自增,然后就可以计算出结果算法的伪代码new n原创 2014-03-31 15:18:44 · 746 阅读 · 0 评论 -
算法十二----左旋转字符串
题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。 如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。算法思路:把字符串看做由两段组成,记作XY,题目的意思是要求出YX。记R(X)为X字符串旋转后的字符串,则R(R(X)原创 2014-04-16 09:33:29 · 797 阅读 · 0 评论 -
算法学习五---输出链表中倒数第k个结点
题目:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针算法思路:定义两个指针p,qZ指向链表头,然后让q向后移k个偏移量,此时p,q相差距离为k,然后再让p,q同时向后移,直到q指向链表尾,此时p的值就是所要求的算法伪代码initialize 2 pointer,let them point to li原创 2014-04-01 09:41:42 · 882 阅读 · 0 评论 -
算法学习十三----和为n连续正数序列
题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。算法思路采用辅助空间保存序列。用i从1开始做起点,j从i+1开始,直到i等于(1+n)/21、如果i-j的和等于n,则输出序列2、如果i-j的和大于n,则将序列清空3、如果i-j的和小于n,则将j假原创 2014-04-17 21:25:26 · 738 阅读 · 0 评论 -
算法学习十七----计算n的阶乘中0的个数
题目:给定一个整数n,那么n的阶乘n!末尾有多少个0呢?例如:n=10,n!=362800,n!的末尾有两个0如果直接计算出n的阶乘再判断的话不仅耗时而且还会有溢出的情况。首先考虑N!=K*10^M且K不能被10整除,那么就可以知道N!末尾有M个0。再考虑对N!进行质因数分解,N!=(2^X)*(3^Y)*(5^Z)...,由于1-=2*5,所以M只与X和Z有关,每一对2和5就能得原创 2014-05-05 15:39:53 · 1444 阅读 · 0 评论 -
算法学习十四----逆序输出链表
题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。逆序输出链表,可以采用借用额外空间,使用栈的数据结构,然后遍历一次链表,且每遇到一个节点就将其放入到栈中,直到最后一个节点,最后将栈输出,这样就实现了逆序输出链表。还有一种方法就是递归实现,每次访问到一个节点的时候,先递归输出它的下一个节点,再输出节点本身,这样就实现了想要的结果。算法伪代码如下:原创 2014-04-18 15:22:26 · 1213 阅读 · 0 评论 -
经典排序算法之插入排序
在生活和学习中,我们常遇到要对一组数据或一系列的对象进行一种操作,使其成为一组从大到小或从小到大的序列。这就是我们所熟悉的排序。排序(Sorting)是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。在生活和其它领域上也有广泛的应用。最早提出排序的概念的是美国的Herman Hollerith。当时主要是为了解决打孔机的问题,一直发展到原创 2012-11-16 22:13:03 · 846 阅读 · 0 评论