算法
19年,重新开始写
求学之路,泛结良师,广交益友
展开
-
删除已排序数组中的重复数据
题目理解:1.操作的对象是一个已经排好序的整形数组2.输出一个整形值length ,表示删除该整形数组中的重复数值之后的数组长度3.题目要求不能分配一个新的数组内存4.在最后,原来的数组的前length个数据时已经排好序的没有重复的该数组实现代码:public class Main{ public static void main(String[] args){ int原创 2017-01-14 23:12:39 · 354 阅读 · 2 评论 -
查找字符串数组的最大公共前缀
题目:给出一个字符串数组,输出所有项的最大长度的公共前缀考虑情况:字符串数组长度为0时,输出"";实现代码:public class Main{ public static void main(String[] args){ String strs[] = new String[]{"aa","a"}; new Main().longestCommonPref原创 2017-01-14 23:54:02 · 1040 阅读 · 1 评论 -
经典递归算法之哈诺塔问题
汉诺塔问题:有三根柱子A,B,C,其中A上面有n个圆盘,从上至下圆盘逐渐增大,每次只能移动一个圆盘,并且规定大的圆盘不能叠放在小的圆盘上面,现在想要把A上面的n个圆盘全部都移动到C上面,输出移动的总步数以及移动的过程分析://先求出移动的总步数1,假设g(n)表示n个圆盘时的移动总的步数,当n=1时,g(1)=1;2.现在可以把g(n)进行细分为三步: 1>先将n-1个圆盘从A通过C移动到原创 2017-03-20 11:53:31 · 1356 阅读 · 0 评论 -
递归经典算法之多转向旋转方阵
1.将前n^2个正整数填入n*n的方阵中,分为四个转向:1>从方阵的左上角开始,由外层至中心按照顺时针的方式螺旋排列而成的数字方阵,称为n阶顺转向内方阵2>从方阵的左上角开始,由外层至中心按照逆时针的方式螺旋排列而成的数字方阵,称为n阶逆转向内方阵3>从方阵的中心开始,由中心至外层按照顺时针的方式螺旋排列而成的数字方阵,称为n阶顺转向外方阵4>从方阵的中心开始,由中心至外层按照逆时针的方式螺旋原创 2017-03-20 21:23:51 · 1203 阅读 · 0 评论 -
递归算法经典之快速排序
1.快速排序采用分区交换排序的概念,将一列数据通过基准数来分成两个部分,左边为比基准数小的数,右边为比基准数大的数,一般来说选取的基准数都是进行快排的这一列数据的第一个数据2.快速排序的主要思想:每次以第一个数为基准数,来分开当前进行操作的那一段,通过使用两个指针,一个从左向右查找大于基准数的index索引指针i,一个从右向左查找小于基准数的index索引指针j,最终比较的条件是i == j,这时候原创 2017-03-20 21:35:59 · 712 阅读 · 0 评论 -
回溯经典算法之四皇后问题
1.问题概述:在一个4*4的方格中住着四个皇后,他们之间都不友好,相邻就会打架,现在要进行查找能够满足:每行每列每个斜线都只有一个皇后,才能没有打架发生2.思路:这里需要这样进行查找,第一个皇后先在第一行第一列开始假定位置,然后第二行第二个皇后满足条件来摆放,如果到后面有皇后不能放在能满足条件地方了时就回到她的前一个皇后并换一个地方,或者在前一个。。。就这样,最后得到了结果是2413定义一个数组a[原创 2017-03-21 19:33:22 · 9104 阅读 · 4 评论 -
分数数列算法实现java
1.分数数列概念:一个递推的分数数列的前面六项为:1/2,3/5,4/7,6/10,8/13,9/15…归纳出数列的构成规律并输出第n项以及前n项中的最大项的值2.分析:该数列有两个规律:1>分母d与分子c存在关系表达式:d=c+i,i表示当前显示的是第i个数;2>分子c为前面i-1项中的所有分子、分母都不相同的最小正整数3.实现代码:public void fun(){ System.ou原创 2017-03-15 20:37:15 · 732 阅读 · 0 评论 -
超级素数实现算法
1.超级素数的概念:一个m位数的素数,从高位到低位一次去掉一个数,仍然都是素数。输入m,输出m为超级素数的总个数并且输出最大m为的超级素数2.分析:可以从两个方向出发:1>从1位开始找素数,然后一步步加位数,查找素数;2>从m位开始找,然后在去掉最高位,在查找素数。。。 不管是什么方法,我们都发现,超级素数f一定是素数或者f个位数一定是3或者73.实现代码:public class test{原创 2017-03-16 17:33:04 · 3816 阅读 · 1 评论 -
杨辉三角算法
1.杨辉三角算法分析:1>每一行的首尾都是12>第几行就有几个元素3>从第三行开始,除了每行的首尾,其余的每一个元素都是上面的两个相邻的元素之和2.实现代码:public class test{ public static void main(String[] args){ test t = new test(); t.fun();原创 2017-03-16 18:01:23 · 966 阅读 · 0 评论 -
java高并发程序设计总结一:走进并行世界
2014年底,就在大家都认为并行计算必然成为未来的大趋势时,在Avoiding ping pong论坛上,Linus Torvalds提出了一个截然不同的观点:“忘掉那该死的并行吧!”(原文:Give it up. The whole”parallel computing is the futrue” is a bunch of crock)忘掉那该死的并行对于并行计算,Linus提出两个特例,那就翻译 2017-10-19 14:49:31 · 448 阅读 · 0 评论 -
zigzag conversion 字符串的Z字形分离
zigzag conversion也就是所谓的字符串的Z字形分离算法,将指定的字符串根据Z字形结构分离成指定长度的子串题目如下: 实现代码:public class Main{ public static void main(String[] args){ String str = "PAYPALISHIRING"; int rows = 3;原创 2017-01-14 18:11:00 · 440 阅读 · 0 评论 -
罗马转换成阿拉伯数字,数值大小0-3999
罗马转换成阿拉伯数字的几个规则:1.I->1 V->5 X->10 L->50 C->100 D->500 M->10002.一般的规则是所有的罗马数字进行相加,也有一个特殊情况:如果I/X/C在大数前面,则是加数,如果在大数后面,则是减数具体代码实现:public class Main{ public static void main(String[] args){ Sy原创 2017-01-14 12:43:51 · 379 阅读 · 0 评论 -
交换两个整型变量其实并不需要第三者
在编程中,经常容易遇到交换两个变量的情况,比如实现“找出两个整型变量m,n的最小公倍数和最大公约数”的算法时,一般的算法开始找出两个数中最大的数然后进行交换给m,最小的数交换给n,然后实现运算。在交换的过程中一般都是如下这样的代码: public void swap(int m.int n) { int temp; temp=m; m=n; n=temp;原创 2016-04-12 13:14:46 · 528 阅读 · 0 评论 -
回文数的判断(考虑所有情况)
如下所有情况:1.当数值为负数时,返回false;即负数不是回文数2.当数值最后一个数为0并且这个数值本身不是0时,返回false3.如果是使用数值反转比较的话,需要考虑溢出的情况在此,我使用的是数值反转的思想,不过鉴于数据溢出的情况,在这里并不是反转整个数值,而是将数值进行折半反转赋值给一个数值,然后两个数值进行比较具体实现代码:public class Main{ public bo翻译 2017-01-14 11:54:54 · 519 阅读 · 0 评论 -
合并两个有序列表
主要思想:同时遍历两个列表,同时对两个列表进行数值的比较,在这里是使用自定义的列表,因此比较的就是里面的val的值在这里需要注意几个细节:列表1为空和列表2为空两种情况的逻辑与和逻辑非的处理方法实现代码://自定义列表class ListNode{ int val; ListNode next; ListNode(int val){ val = val;原创 2017-01-14 17:56:18 · 680 阅读 · 0 评论 -
二叉树的前序遍历的递归实现与非递归实现
概念 二叉树的前序遍历可以称为前根序遍历,遍历的顺序依次为:每个(子)树的根节点->左子节点->右子节点 举例说明 该图的前序遍历的结果为:ABDECF 前序遍历非递归实现思路步骤讲解: 对于任意结点p(当前遍历的结点): 1.先输出该节点,然后存放到栈中,执行:p = p->left;并判断p是否为空 2.p不为空(即之前结点的原创 2017-10-10 17:23:03 · 1110 阅读 · 0 评论