
算法数据结构
吴孟达
关注微信公众号"程序员达叔",免费领取海量学习资料
展开
-
猴子吃桃问题
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个 第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。思考片刻~递归算法破之。切记,递归要向已知方向递归。import java.util.*;class Peach{ static int num;原创 2013-04-21 21:38:35 · 1646 阅读 · 0 评论 -
java实现冒泡排序,选择排序,插入排序,快速排序(简洁版)及性能测试
1、冒泡排序是排序里面最简单的了,但性能也最差,数量小的时候还可以,数量一多,是非常慢的。它的时间复杂度是O(n*n),空间复杂度是O(1)代码如下,很好理解。public void bubbleSort(int[] arr){ int temp=0; for(int i=0;i<arr.length;i++){ for(int j=arr.length-1;j原创 2013-09-17 21:37:51 · 5177 阅读 · 5 评论 -
寻找一个字符串中最长的重复子串,如 abcdabc 最长重复串 是abc
下午就要去参加阿里巴巴的笔试了,早上起来做一道据说是阿里巴巴13年校招的考题找找手感。。。题目是寻找一个字符串中最长的重复子串。 如 abcdabc 最长重复串 是abc这个题还是挺有意思的(不过好像没啥难度,我竟然没有调试,写一次就运行出来了。。)用简单的两层循环,结合substring()方法就可以了直接上代码吧~class Test{ String reg,left;原创 2013-09-14 11:22:57 · 10407 阅读 · 9 评论 -
一段代码让你理解二叉树的递归奥秘
class TreeNode{ TreeNode left; TreeNode right; int val; TreeNode(int val){ this.val=val; } static void scanNodes(TreeNode root){ if(root!=null){ System.out.println("this is node :"+root原创 2013-12-23 10:21:12 · 4609 阅读 · 1 评论 -
设计两个不同的方法,判断一个数是否为2的阶次数
思路很简单,直接上代码package go.derek;public class Judge { //递归方法 public boolean judge1(double n){ n/=2; if(n==2){ return true; } //如果始终不等于2,则肯定有以下两种情况 if(1<n&&n<2||2<n&&n<3){ return fal原创 2013-10-12 23:43:35 · 1941 阅读 · 0 评论 -
顺序查找的优化方法
我们知道折半查找的速度比顺序查找要快很多,但前提是折半查找需要有序的数组。讲解在注释里面~package go.derek;import java.util.Random;public class Search { //这个是普通的顺序查找,for循环里面每执行一次都要判断一下i<=arr.length //这个是会消耗时间的 public int seqSearch(int[原创 2013-09-20 19:16:45 · 2000 阅读 · 0 评论 -
冒泡排序优化版,性能近乎翻倍
原始的冒泡排序相对而言是非常耗时的,即使一个数组经过几轮交换已经变的有序了,例如[2,1,3,4,5,6,7]这个数组,经过第一轮,已经变成有序的了,但顽固的冒泡还是要继续进行没有营养的两两比较,从而牺牲了时间。如果用一个flag来判断一下,当前数组是否已经有序,如果有序就退出循环,这样可以明显的提高冒泡排序的表现~由于冒泡排序的时间复杂度为O(n*n)所以当数据越多的时候,越慢,非常不适原创 2013-09-19 12:53:53 · 4058 阅读 · 2 评论 -
java快速排序1000万无序数组JVM-Xmx=256M 耗时2s
自己动手写排序算法,快速排序是比较不好写的了~import java.util.*;class Test{ public void quickSort(int[] arr,int low,int high){ if(low<high){ int i=low; int j=high; int x=arr[low]; while(i<j){ while(原创 2013-09-18 12:36:22 · 2675 阅读 · 1 评论 -
一道2014年阿里巴巴校招笔试题
题目是某缓存系统采用LRU算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候,1,5,1,3,5,2,4,1,2出现缓存直接命中的次数是()次,最后缓存中即将准备淘汰的数据项是()。先解释下概念吧LRU(least recently used)算法:就是把最近一次使用时间离现在时间最远的数据删除掉。更多详细的了解请看我写的这篇博文如何用LinkedHashMa原创 2013-09-16 12:14:18 · 4085 阅读 · 2 评论 -
如何用LinkedHashMap实现LRU缓存算法
阿里巴巴笔试考到了LRU,一激动忘了怎么回事了。。准备不充分啊。。缓存这个东西就是为了提高运行速度的,由于缓存是在寸土寸金的内存里面,不是在硬盘里面,所以容量是很有限的。LRU这个算法就是把最近一次使用时间离现在时间最远的数据删除掉。先说说List:每次访问一个元素后把这个元素放在 List一端,这样一来最远使用的元素自然就被放到List的另一端。缓存满了t的时候就把那最远使用的元素remov原创 2013-09-15 20:18:06 · 24963 阅读 · 9 评论 -
字符串循环右移java算法
输入一个字符串,然后讲该字符串循环右移4位例如输入abcdefgh 则输出efghabcd下面有两个方法,第一个是将字符串转换为一个字符数组char[ ];然后循环复制替换import java.util.*;class Move { public static void main(String[] args) { Scanner sc=new Scanne原创 2013-04-16 10:11:42 · 3820 阅读 · 3 评论 -
随机生成长度为100的数组,数组元素为1到10,统计出现次数最多和最少的元素
思路很简单,大家一看就懂。import java.util.*;class Max{ static int a,b,c,d,e,f,g,h,i,j; public static void main(String[] args) { int[] num=new int[100]; Random rd=new Random(); for(int n=0;n<100;n++原创 2013-04-25 12:35:40 · 3963 阅读 · 2 评论 -
最简单的修改HashMap value值的方法
说到遍历,首先应该想到for循环,然而map集合的遍历通常情况下是要这样在的,先要获得一个迭代器。Map map = new HashMap<>(); Iterator it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.E原创 2013-08-02 12:40:36 · 44958 阅读 · 2 评论 -
求1000以内所有素数/合数(之和),java算法(23行)
这基本上是最简单的方法了,应该没有之一了,嘿嘿~根据素数的定义:只能被1和他本身整除。1不是素数。写出下面代码,运行正确。把注释去掉可以求出1000以内所有素数的和。class FindAll { //static int sum=0; static void find(int i) { int t=0; for(int k=1;k<=1000;k++) {原创 2013-04-04 21:18:36 · 5952 阅读 · 0 评论 -
求连续子数组最大和,两种算法
一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值下面是一个效率很低的方法两层循环,思路是分别以每一个元素为起点,定义一个temp值保存现有的最大和,如果遍历到的连续子数组的和大于temp那么则交换两者的值。import java.util.*;class BigChild{ public sta原创 2013-04-16 15:34:35 · 1758 阅读 · 0 评论 -
面试题:编程实现全排列,选择排列java算法小谈
实现起来有很多方法,下面介绍一个代码最简单的,但理解起来稍微费点劲的算法。。import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FullSort { //将NUM设置为待排列数组的长度即实现选择排列 pri原创 2013-04-02 11:03:27 · 5197 阅读 · 0 评论 -
【leetcode Java】二叉树的递归遍历以及最大深度的求解(Java)
递归是非常神奇的方法,代码看起来很简洁。对二叉树的遍历和求最大深度可以用递归的方法,主要思路就是遍历左子树,再遍历右子树。如果左子树上面的结点,有右孩子,则调用右子树的方法;遍历到左子树的叶节点的时候,返回,开始遍历右子树。如果右子树上面的结点有左孩子,则调用左子树的方法,遍历到右子树的叶子结点的时候,程序结束。static void scanNodes(TreeNode root){ i原创 2013-12-20 09:36:25 · 11406 阅读 · 0 评论