自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 微软算法100道题------求一个矩阵中最大的二维矩阵(元素和最大)

题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;思路:最简单的思路:从头遍历数组,每次遍历是都记录下当前二维矩阵的值与最大值的比较,如果大于最大值,则将最大值替换,如果不是,则遍历下一个,事件复杂度为O(4n)也就是O(n

2015-11-25 14:12:43 705

原创 微软算法100道题-----字符匹配算法;

题目:实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1231******3***2 ,12*****3这些都要找出来其实就是类似一些和谐系统。。。。。思路:先将这个字符串hash,然后过程中记录每个元素的位置,就是在字符串中的位置;要求找出目的串中全部都出现,所以就把记录中对应的位置每个数和其他数做笛卡尔积;比如题

2015-11-25 11:42:41 418

原创 微软算法100道题------通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小

题目:有两个序列a,b,大小都为n,序列元素的值任意整数,无序;要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。例如:   var a=[100,99,98,1,2, 3];var b=[1, 2, 3, 4,5,40];思路:两个数组求和相减,求出差,然后用每个数组中的每个数和另一个数组中的数进行比较,如果相加总差变小,

2015-11-25 11:40:46 804

原创 微软算法100道题-------输入两个整数序列。其中一个序列表示栈的push顺序, 判断另一个序列有没有可能是对应的pop顺序。

题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。   比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。因为可以有如下的push和pop序列:push 1,push 2,push 3,push 4,pop,pu

2015-11-24 15:06:01 1061

原创 微软算法100道题------从1到n的正数中1出现的次数

题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次。思路:个位数时,判断一子就可以了,十位数是先判断十位是否为1,如果为1,计数器加一,然后再将这个数除以10取余数,再判断余数,百位的话一样,除以10看是否余数是否为1,不是的话剩下的又是十位数了,然后重复循环

2015-11-24 15:01:37 322

原创 微软算法100道题-------跳台阶问题

题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。思路:设当有n级台阶的时候有f(n)中跳法,那么上了一级台阶,剩n-1级台阶,就是f(n-1)中上法,那就是f(n) = f(n-1)+f(n-2)+....也就是斐波那契数列

2015-11-24 11:41:09 298

原创 微软算法100道题------定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)思路:直接操作翻转肯定不行,因为有时间和空间的复杂度限制;所以思路一: 将这个字符串分为两段,以旋转的地方作为分界线,先将这两段分别翻转

2015-11-24 11:27:12 789

原创 微软算法100道题

题目:输入两个整数 n 和 m,从数列1,2,3.......n 中 随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.思路:设置两个指针,指向开头和结尾,因为数是连续的,也就是有序数组,如果两个数相加大于要查的数,则两个数过大,将右面的数向左移动,反之一样;

2015-11-23 19:27:09 307

原创 微软算法100道题-----输入一个表示整数的字符串,把该字符串转换成整数并输出

题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。思路:将字符串变成字符数组,然后从低到高遍历,进一位就i = i * 10;然后用i * 那位数,最后加到一起就是答案,时间O(n);

2015-11-20 16:18:45 501

原创 微软算法100道题-----Fibonacci数列

题目:定义Fibonacci数列如下:     / 0 n=0f(n)= 1 n=1  \ f(n-1)+f(n-2) n=2输入n,用最快的方法求该数列的第n项。思路:这个。。。我只是知道最普通的那种答案。。。。

2015-11-20 16:13:43 235

原创 微软算法100道题

题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。思路:这道题的思路。。。  我是没有思路,感觉得用得到数学公式之类的东西,所以上网查了一下:分析:既然题目有一个数字

2015-11-20 16:10:42 347

原创 微软算法100道题-----:在一个字符串中找到第一个只出现一次的字符

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。思路:首先想到的一种比较麻烦的方法:就是从头遍历数组,将走到的数放入一个a数组中,如果a数组中有这个数则将这个不放入数组中,并将该位置的flag标志位1,代表该位置的数字不为一个,最后遍历一遍a数组,flag标志位为0的就是只出现一次的,但时间复杂度好像为O(n*long(n));还

2015-11-20 10:08:52 316

原创 微软算法100道题-----输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印

题目:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。   思路:利用队列;一个节点出队列时把它的左节点和右节点一次放入队列中;根节点出队列,左节点入队列,右节点入队列;左节点出队列,左节点的左右子节点入队列。。。。。。。。。

2015-11-20 09:49:16 363

原创 微软算法100道题-----求二叉树中节点的最大距离

题目:求二叉树中节点的最大距离...如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。思路:求二叉树中节点最大距离,最大的距离可以分为两种情况;第一种经过根节点,就是左子树最左节点到右子树的最右节点;第二种就是在根节点的左子树或者右子树

2015-11-20 09:48:10 455

原创 微软算法100道题-----输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点思路:这个感觉没什么难的,就是遍历树,把左右子树用temp_tree转换一下

2015-11-19 18:27:05 371

原创 微软算法100道题-----输入一颗二元查找树,将该树转换为它的镜像, 即在转换后的二元查找树中,左子树的结点都大于右子树的结点

题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点思路:这个感觉没什么难的,就是遍历树,把左右子树用temp_tree转换一下

2015-11-19 18:23:22 530

原创 微软100道算法题-----输入一个已经按升序排序过的数组和一个数字, 在数组中查找两个数,使得它们的和正好是输入的那个数字。 要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对

题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。思路:设置两个指针,放在开头结尾,两个数相加,如果数大了,那就右面的指针想左走,如果小了右面的指针向右走

2015-11-19 18:17:13 1273

原创 微软算法100道题------输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针

题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针思路:1. 可以把这个链表遍历到数组上,然后输出,不过这个会开出O(n)的空间,但时间应该最快;2. 可以设两个指针,第一个先走,第二个不动,等第一个走过k个节点的时候走,这样一二之间就差k个单位了,等一个到达最后一个时,第二个就是了,时间差不多,但不用开空间;

2015-11-19 18:10:48 491

原创 微软算法100道题-----翻转句子中单词的顺序

题目:翻转句子中单词的顺序。题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I am a student.”,则输出“student. a am I”。思路:用空格分隔字符串.split("  ");然后在设置指针翻转;。。。

2015-11-18 16:24:03 301

原创 微软算法100道题-----判断整数序列是不是二元查找树的后序遍历结果

题目:判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true,否则返回false。例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:  8  / \  6 10  / \ / \  5 7 9 11因此返回true。如果输入7、4、6、5,没有哪

2015-11-18 16:23:19 280

原创 微软算法100道题-----特殊题

1.让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。如果你只能将金条切割两次,你怎样分给这些工人?思路:切割两次让其变成三份,分别为 1/7 ,  2/7  ,4/7; 第一天给1;      第二天给2,要回1;        第三天给1和2;。。。。。。以此类推,类似于找钱;2.颠倒一个句子中的词的顺序,比如将“我叫克

2015-11-18 14:30:25 290

原创 微软算法100道题------判断俩个链表是否相交

题目:给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:1.如果链表可能有环列?2.如果需要求出俩个链表相交的第一个节点列?思路:1、简单的那种情况:既然是单链表,如果两个链表有链接则一定为Y型,不可能为X型,因为单链表的节点只能指向一个节点,所以,两个都走到最后一个节点,判断是否一致

2015-11-13 14:08:26 304

原创 微软算法100道题-----第六题

题目:要求下排每个数都是先前上排那十个数在下排出现的次数。   上排的十个数如下:   【0,1,2,3,4,5,6,7,8,9】举一个例子,   数值: 0,1,2,3,4,5,6,7,8,9   分配: 6,2,1,0,0,0,1,0,0,0   0在下排出现了6次,1在下排出现了2次,   2在下排出现了1次,3在下排出现了0次....   以此类

2015-11-13 10:41:21 237

原创 微软算法100道题-----查找最小的k个元素

题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。答案:1、这个时间复杂度为O(n),从头遍历一遍,将这些数映射到相应的数组上,比如1,就映射到result[1],5就映射到result[5],然后result数组从后往前数k个,就是结果;但这种方式可能特别浪费空间,在某种情况下,就比如最后一

2015-11-13 10:28:18 294

原创 微软算法100道题------在二元树中找出和为某一值的所有路径

题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数22和如下二元树 10     / \     5 12     / \     4 7则打印出两条路径:10, 12和10, 5, 7。答案:因为是从树的根节点开始,所以就遍历树,每到一步就判

2015-11-13 09:56:48 285

原创 微软100道算法题------求子数组的最大和

题目:             输入一个整形数组,数组里有正数也有负数。             数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。             求所有子数组的和的最大值。要求时间复杂度为O(n)。              例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2

2015-11-12 17:14:58 329

原创 微软100道算法题------O(1)min

题目:         定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。          要求函数min、push以及pop的时间复杂度都是O(1)。思路:        时间复杂度要求O(1),则用空间换时间;建立辅助栈,这个栈记录当前最小值的位置或者值;push的时候,当前最小值和要push的值比较一下,push到辅助栈的还是小的数;pop

2015-11-12 16:48:37 312

原创 微软100道算法题第一题------二叉排序树变成排序的双向链表

题目:           输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。           要求不能创建任何新的结点,只调整指针的指向。思路:二叉排序树是右节点比跟大,左节点比根小的二叉树;只要按顺序比二叉排序树输出就ok,当前和下一个建立双向连接,所以感觉这道题主要是顺序遍历二叉树;先找到二叉树的最左节点,在走到它之前把它的父节点flag标志位设

2015-11-12 16:38:34 491

原创 堆排序

堆排序分为变成大根堆还是小根堆;大根堆就是跟节点大于左右子节点就ok,小根堆跟它相反,根节点小于左右子节点;有一个无序的树(就是你要排序的数组,放在树里),你想要对它进行排序的话,首先要确定从大到小还是从小到大,因为这个分别对应大根堆还是小跟堆;随便说一个,就说变成大根堆(从大到小):首先一个无序的树,你找到最下面一层的节点,每两个子节点或一个子节点和他们的父节点都看成一个单位,在这一

2015-09-12 15:07:25 312

原创 直接插入排序,折半插入排序,希尔排序

这三种都属于插入排序;    1.直接插入排序就是先拿出两个排好序,然后再依次加入这个有序序列中,比较简单,但是时间复杂度为O(n2);    2.折半插入排序是在直接插入排序的基础上改进的,每次插入到有序序列的时候,用折半查找找到要插入的位置,然后插入,能稍微快一点;    3.希尔排序(缩小增量排序)每次选一个增量,这个增量为上一次的一半,第一次为排序个数的一半,就是每次隔增量个位

2015-09-11 22:29:36 507

原创 二叉排序树相关操作

二叉排序树定义就是左子树比根小,右子树比根大;中序遍历出来的书递增的有序序列;     先说它的查找:类似于二分查找,时间复杂度为logN,这个很好理解吧,就是拿你要找的数从根比,大的话走右面,小的话走左面,每次减少一半;     再说它的插入:只要这个节点不是最底层的节点(就是这个节点下面没有其他节点了),就跟它比较如果小于就往左走,如果大于就往有走,走到空时插入;java实现:

2015-09-11 18:26:06 267

原创 sleep和wait的区别

如果这下面说的看不太懂,可以先去看一下上一篇可能会好一点;线程调用了wait()方法的话,该线程将会自己所有的锁标记和CPU的占用,并且进入等待池(wait pool),等待池的状态是阻塞状态;顺便说一下对应的notify()方法,会从等待池中释放一个线程,这个线程是有系统决定的 ,让该线程进入该对象的锁池(lock pool),等待得到锁标记,然后再执行;notifyall()方法取代n

2015-09-01 15:47:45 345

原创 synchronized和lock的区别

先说一下什么是同步(synchronized和lock都是实现这个的):          每一个对象都有一个互斥的锁标记和一个锁池,哪个线程拥有锁标记哪个才能访问,没有锁标记的线程就进入锁池,保证同步代码块中只有一个线程     synchronized修饰的代码块是对括号内的对象加锁,只有拥有锁标记的线程能访问;     synchronized修饰的函数方法是整个方法范围内对当前

2015-09-01 14:26:23 923

原创 java集合类,collection,list,set,map

list数组集合,set不允许有相同的值存入,map是键值对(key--value)。list:       ArrayList和LinkedList的区别:ArrayList:自动增长的数组,查询效率比较高,但是添加和删除效率比较低,如果一开始有大量的数据确定加入,而不是动态的添加,可以用ensureCapacity方法加入一下,这样效率可以高一点;LinkedList:是用双向

2015-08-31 17:18:55 603

原创 css中的float和相对定位,绝对定位,z-index

css中有float浮动属性,参数分别为left,right,none和inherit,意思分别为左浮动,有浮动,不浮动和继承父元素浮动属性;那浮动是什么意思呢?浮动就是说这个元素飘起来了,假设你在直升飞机上向下看一座房子,这座房子一开始只有一层,所有房间都在最底层,这里房子就是元素;浮动一个元素就是这个房子移动到2楼了,不跟其他房子在一个楼层了,那面下面的房子就可以向上占住浮动上来的元素

2015-08-25 17:21:34 2127

原创 数据库--分页

分页这个操作就是你在网页上看新闻时,一屏显示可能10个标题,20个标题,如果很多数据,肯定不可能一个页面全部显示出来,所以就要做分页,就是页面下方的1,2,3,4,5,6.......这样的那怎么做分页,这个很简单,我用的是mysql数据库(现在大多数都用mysql)sql语句中有一个limit,这个可以传两个参数,第一个参数是偏移量,第二个参数是数量那你做的时候第一次可以先取出10个

2015-08-19 12:27:06 359

原创 拓扑排序算法

拓扑排序算法就是说明aov网中前驱和后继的关系入度为0优先算法就是每次把入度为0 点去掉         还有相应的出度为0优先算法,就是上面的相反的

2015-08-15 14:23:03 340

原创 普里姆算法,克鲁斯卡尔算法

这两种算法都是得出最小生成树的算法,只不过方法不同普里姆是归并点而克鲁斯卡尔是归并边先说普里姆算法先随意选一个点加入归并点数组之中,然后选出与这个点关联的最小的权的点,输出,并把那个点也加入归并点数组之中,然后再从每一次都从归并点数组之中选一个点道不在这个数组之中的点的最小的权值,再把这个点也加入归并点数组,知道所有的点都在归并点数组之中•1. 从某顶点 u

2015-08-15 14:18:42 5639 1

原创 广度优先搜索

广度优先搜索就是一个点,把他所有的连接的点都走一遍,然后再从他所连接的点再递归出去之前写那个深搜的时候写了一个递归和一个循环,但大体思路都差不多,这个也是,所以就写一个循环吧,好理解一点伪代码:int    flag = 0;  // 这个就是标记量,标记有多少个已经走过了,如果这个flag == 总共的点数,那么就代表程序输出结束了对象  point

2015-08-14 18:23:43 399

原创 深度优先搜索

深度优先搜索就是有多远就走多远,能滚到哪就滚到哪这个思想是从头访问一个点,输出这个点,然后把这个点标记为已读,找到与他相连的任意一个点,再次进行此操作,递归挺好理解的哈给个例子:伪代码:int    flag = 0;  // 这个就是标记量,标记有多少个已经走过了,如果这个flag == 总共的点数,那么就代表程序输出结束了对象  point

2015-08-14 16:45:08 417

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除