- 博客(17)
- 收藏
- 关注
原创 归并排序
归并排序的原理是分治算法。如图,可以看到有两部分,一为分,一为治(合并)。这样有一个优点,与不稳定的快速排序相比,归并排序极为稳定。import org.junit.Test;public class test { //两路归并算法,两个排好序的子序列合并为一个子序列 public void merge(int []a,int left,int mid,int right){ int []tmp=new int[a.length];//辅助数组 int
2020-09-03 15:48:39 112 1
原创 java原型模型以及浅拷贝深拷贝问题
原型模式的定义与特点原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效,根本无须知道对象创建的细节。例如,Windows 操作系统的安装通常较耗时,如果复制就快了很多。在生活中复制的例子非常多,这里不一一列举了。原型模式的结构与实现由于 Java 提供了对象的 clone() 方法,所以用 Java 实现原型模式很简单。这里要重点解释的是原型模式的浅拷贝深拷贝
2020-08-01 20:44:04 172
原创 java static关键字得理解!看完秒懂!!!
一.变量当一个变量前面有了static这个修饰符,内存会为它分配唯一的一块存储空间。程序跑起来的时候,变量就存在在内存里了。谁要用它,就去访问一下它所在的内存。假如内存是澡堂子,static变量就像一坨肥皂,一整个澡堂子的人都共用之。。不管澡堂子里有没有人,肥皂总是在这里。编译器想拿出肥皂来玩一玩,直接吼出肥皂的名字就好了。如果这是一个非static的变量,则是对每个对象有一份存储空间。程序跑刚起来的时候,是没有这个变量的。相当于一个澡堂子里每个人都有一坨肥皂。如果没有人,也就没有肥皂。编译器想要用肥皂来做
2020-07-25 23:24:24 155
原创 java算法---二分法查找
二分法一般有两种实现方式第一种public static int binarySort(int[] array, int key) { int low = 0; int high = array.length - 1; while (low <= high) {//这里要有等号! int mid = (low + high) >>> 1; if (key < array[mid]
2020-07-21 22:28:52 140
原创 关于Java多态的理解
Collection arr1 = new ArrayList();List arr2 = new ArrayList();ArrayList arr3 = new ArrayList();经常看到这三种定义集合的方式。通常我们在使用列表的时候都是这样写的:List list = new ArrayList();而不是ArrayList list = new ArrayList();第一种为什么比第二种好?假设你用了二种方式声明一个列表,然后被其他人引用了(或者被你自己
2020-07-21 22:22:20 105
原创 剑指25--合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4分析:链表。遇事不觉,双指针法。定义两个指针,一个指针不动(为了返回头结点用的),一个指针迭代插入用的。由于合并的是结点值从小到大的,难就在L1和L2链表中找谁小,谁小插入到新链表中就完事了。class Solution { public ListNode mergeTwo
2020-06-28 22:26:07 80
原创 剑指24--反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。分析:芜湖,经典题目.头插法,原理是重新创建一个Null结点pre,然后把要反转的链表的第一个结点cur插入到该结点pre之后,然后把cur结点往后移一位,重复上述过程。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x)
2020-06-28 22:11:30 103
原创 剑指22--链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。分析:不得不说剑指的easy题真的思路很好想。遇到链表题目一定要画图!一定要画图!要么先反转过来,直接找第K个,要么双指针(双指针的思路参见上两题有个删除链表结点用到的方法,让一个指针跟着另外一个指针屁股后面,参见前面博客),这里的双指针距离不再是紧跟了,是隔着K个距离
2020-06-28 21:57:32 86
原创 剑指21--调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。分析:第一反应双指针,一个指向数组开头,一个指向数组结尾,然后插入奇数就丢在开头,然后索引加1;插入偶数就丢在结尾,索引减1.当然要建一个相同大小的新数组。这里nums[i] & 1和前面碰到的要转化成二进制的题目用的是相同的方法,奇数转化为二进制,他的最后以为一定是1,偶数转化为二进制,他的最后以为一定是0.以后可以不用%2==0来判断奇数偶数hhhclass Solu
2020-06-28 21:43:50 103
原创 剑指18--删除链表的节点
题目:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。分析:删除结点很简单,只需要知道被删除结点的前一结点即可,先求出前一结点,然后删除即可。这里给出两种方法,建议使用第二种双指针,这里双指针只需要将一个指针去搜查被删除的结点,另一个指针跟着这个指针的后面,另一个指针就是我们要找的被删除结点的前一结点了。class Solution { public ListNode deleteNode(ListNode head, int val) {
2020-06-28 21:35:43 114
原创 剑指17--打印从1到最大的n位数
题目:输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。分析:有点憨憨的题目。。。 最简单的方法temp=pow(10,n)-1遍历1到temp就完事了class Solution { public int[] printNumbers(int n) { int a=(int)Math.pow(10,n)-1;//这里pow返回的是double类型 int[] res = new int[
2020-06-26 20:02:14 67
原创 剑指16--数值的整数次方
题目:实现函数double Power(x, n),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。分析:直接计算,这里要考虑n为负数的情况。或者采用递归的方法。递归其实非常简单,首先要写出递归中止的条件,然后写递归即可。递归就像弹簧一样,一直压东西进去(栈),而后压到不能动(碰到中止条件了),而后从最内层开始反弹,直到整个弹簧回复。class Solution { public double myPow(double x, int n) { //来一
2020-06-26 19:54:50 67
原创 剑指15--二进制中1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。分析:把整数转化成二进制然后和1相与,然后移位计数即可。public class Solution { public int hammingWeight(int n) { int res = 0; while(n != 0) { res += n & 1;// n &a
2020-06-26 19:44:08 109 1
原创 剑指14--剪绳子
题目:给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。分析:有点像数学的题目,第一眼的反应是动态规划。开始分析:n=2: 1+1 -->11=1; dp[2]=1;n=3: 2+1 -->21=2;
2020-06-26 19:40:42 118
原创 剑指13--机器人的运动(DFS和BFS)
题目:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?分析:很典型的BFS和DFS的题目,这里需要注意的是上下左右其实在本题中用右和上就可以完成,因为
2020-06-25 23:16:48 142
原创 变分自动编码器Deforming Autoencoders: Unsupervised Disentangling of Shape and Appearance
Deforming Autoencoders: Unsupervised Disentangling of Shape and Appearance先前的工作很多文献,在不同领域上,例如图像和视频处理,文本分析等,都探讨了特征解耦分离的问题。为了达到控制和理解深层网络的目的,必须将变化因子进行解耦。对此,已有很多的研究工作开展。先前很多的工作已经很好的探索到将潜在图像表示分离为不同维度的表...
2020-04-17 12:46:54 696
原创 快速排序JAVA实现
快速排序是冒泡排序的改进版,是目前已知的最快的排序方法。该排序算法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。优点:极快,数据移动少;缺点:不稳定。算法实现假设我们现在要对{5,7,2,1,9,10,4,6,3,8}这个数组进行快速排序,我们应该怎么...
2020-03-13 22:00:38 250 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人