Java
DK23333
这个作者很懒,什么都没留下…
展开
-
把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:列出所有可能,并在列的同时记录出现的最小数。import java.util.ArrayList;import java.lang.Long;public class Solution { ...原创 2018-04-21 23:04:24 · 104 阅读 · 0 评论 -
链表中倒数第k个结点
题目:输入一个链表,输出该链表中倒数第k个结点。思路:定义一个全局变量count记录递归深度。在方法内定义局部变量sign记录当前方法所在深度。两者相减若等于k说明当前深度对应倒数第k个结点。public class Solution { int count = 0; public ListNode FindKthToTail(ListNode head,int k) {...原创 2018-03-28 22:00:16 · 153 阅读 · 0 评论 -
关于集合的总结
TreeMap TreeMap基于红黑树(二叉平衡树加二叉搜索树)。 TreeMap各项操作时间复杂度是O(logn)。 TreeMap的key必须实现compareable或者传入comparable。 遍历得到的结果是有序的(中序遍历)。HashMap HashMap的基础是一个Entry数组。 Entry对象是HashMap的基本元素。同时Entr...原创 2018-04-11 14:20:19 · 162 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路:创建一个与数组等长的新数组,循环目标数组两次,第一次筛出奇数依次加入新数组中,第二次筛出偶数依次加入新数组中,然后把新数组的值copy给目标数组。public class Solution { p...原创 2018-03-28 21:25:36 · 124 阅读 · 0 评论 -
数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。思路:分指数是0,正数和负数来处理。public class Solution { public double Power(double base, int exponent) { if(exponent==0){ retu...原创 2018-03-28 20:56:15 · 81 阅读 · 0 评论 -
二进制中1的个数
题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。分析:java中一个int变量用4字节保存,java中负数默认用补码表示,也就是说用1去和32位中每一位做位运算,结果是1就计数加一。应题目要求符号位当作普通位来计算。public class Solution { public int NumberOf1(int n) { int count =...原创 2018-03-28 20:35:36 · 112 阅读 · 0 评论 -
从上往下打印二叉树
题目:从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:从上往下并且同层节点从左往右显然递归无法实现。那么队列刚好可以满足我们的要求,对节点来说,其左子节点和右子节点按顺序入队可以满足同层从左至右打印。public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode...原创 2018-04-03 23:33:02 · 76 阅读 · 0 评论 -
斐波那契数列
递归版:public class Solution { public int Fibonacci(int n) { if(n<1){ return 0; } if(n==1||n==2){ return 1; }else{ int resul...原创 2018-03-27 23:37:34 · 158 阅读 · 0 评论 -
两个栈实现队列
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:入栈先把栈2全部弹到栈1再入栈,出栈先把栈1全部弹到栈2再出栈,负负得正,先进先出。import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>()...原创 2018-03-27 23:03:30 · 98 阅读 · 0 评论 -
重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:前序遍历第0个元素为根,查找中序遍历根的下标,下标之前为左子树,下标之后为右子树,递归得二叉树。/** * Definition for binar...原创 2018-03-27 22:41:52 · 94 阅读 · 0 评论 -
栈的压入,弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:凭眼神观察,先看右边弹出顺序,比如先弹出4,那么根据入栈顺序,1,2,3必定在4后面弹...原创 2018-04-03 00:08:11 · 119 阅读 · 0 评论 -
选择排序
一共比较array.length趟,每趟有两个指针,移动其中一个,找出值最小的下标,一趟结束交换最小值至下标i处。private static void chooseSort(int[] array){ for (int i = 0; i < array.length; i++){ int pos = i; for(in...原创 2018-03-27 21:34:09 · 120 阅读 · 0 评论 -
二叉树的遍历
二叉树的先根,中根,后根遍历递归思路:根据根左右,左根右,左右根的顺序来递归调用即可实现。import java.util.ArrayList;public class Test2 { private static class TreeNode { int val = 0; TreeNode left = null; TreeNode...原创 2018-03-28 22:58:19 · 134 阅读 · 0 评论 -
关于finally需要注意的地方
finally中的语句不是一定会执行 首先若在执行finally对应的try语句之前方法就执行了return,那么finally将不会执行 其次,若执行到了finally对应的try语句,如果在try中的return语句之前执行了System.exit(0),则java虚拟机退出,finally语句不执行。 若在执行try语句时,所在线程被杀死,那么finally语句同样不会执行。...原创 2018-04-04 12:33:28 · 189 阅读 · 0 评论 -
复杂链表的复制
题目:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 思路:遍历链表然后创建对象。public class Solution { public RandomListNode Clone(RandomListNode...原创 2018-04-06 23:22:14 · 131 阅读 · 0 评论 -
二叉树中和为某一数的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路:先找到二叉树的所有路径,然后计算和,取符合标准的路径:public class Solution { ArrayList<ArrayList<Integer>> result = new ArrayList(...原创 2018-04-06 22:37:55 · 99 阅读 · 0 评论 -
记录ArrayList的一个坑
在写算法时遇到了这么一个需求:用ArrayList去保存ArrayList,然后当作返回值返回。 里面那层ArrayList保存的是int数据,外面那层保存的是ArrayList。涉及到ArrayList的add和addAll还有remove操作。有这么一段代码://错误if(root.left!=null){ ArrayList<Integ...原创 2018-04-06 22:33:42 · 211 阅读 · 0 评论 -
二叉树的深度
题目:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路:遍历二叉树,记录每一条路线的深度并选出最大的。public class Solution { private int result = 0; public int TreeDepth(TreeNode root) { ret...原创 2018-04-22 22:30:45 · 148 阅读 · 0 评论 -
不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:不能用加减乘除就用循环:public class Solution { public int Add(int num1,int num2) { int temp = num2>0?num2:-num2; for(int i=0;i<temp;i+...原创 2018-04-22 21:53:50 · 137 阅读 · 0 评论 -
求1+2+3+...+n
题目:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:那么能想到的只能是递归了:public class Solution { public int Sum_Solution(int n) { if(n==1){ return 1; ...原创 2018-04-22 21:43:34 · 156 阅读 · 0 评论 -
和为S的两个数字
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。思路:将数组中的值两两进行比较,类似冒泡法,只不过换成比较和而不是比较两个数的大小。import java.util.ArrayList;public class Solution { public ArrayList<Integer&g...原创 2018-04-22 21:36:45 · 123 阅读 · 0 评论 -
二叉搜索数的后序遍历
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:所谓二叉搜索数,就是对于所有的节点,节点左边的子节点都小于该节点,节点右边的子节点都大于该节点。已知二叉搜索树的后序遍历,则数组的最后一个节点为根节点。遍历数组找到第一个比根节点大的下标,则该下标往后应该都是右子树,也就是说往后应该都比根节点大。...原创 2018-04-06 18:09:25 · 115 阅读 · 0 评论 -
第一个只出现一次的字符
题目:在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置 思路:遍历这个字符串,并记录每个字符出现的次数。import java.util.ArrayList;import java.util.Iterator;public class Solution { public int FirstNotRepeatin...原创 2018-04-22 14:03:00 · 115 阅读 · 0 评论 -
丑数
题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 思路:结果必然是由2,3,5组成,直接看代码:import java.util.ArrayList;public class Solution { public int GetUglyNumber...原创 2018-04-22 13:20:10 · 118 阅读 · 0 评论 -
单例模式
用静态内部类实现单例public class SpecialSingleton { // 静态内部类 private static class InnerClass { private static SpecialSingleton instance; static {//静态代码块只被初始化一次,并且虚拟机保证其线程安全。...原创 2018-04-05 12:46:59 · 83 阅读 · 0 评论 -
包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 思路:和普通栈一样,包含入栈,出栈,只不过在入栈的时候判断并保存最小值,在出栈时重新计算最小值。ArrayList实现:public class Solution { private ArrayList<Integer> list = new ArrayList(); int m...原创 2018-04-02 22:47:39 · 85 阅读 · 0 评论 -
顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 思路:先计算矩阵的层数。然后来一个for循环,一层一层的打印。public class Solution { pu...原创 2018-04-02 21:25:35 · 116 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
题目:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。思路:先得出求一个整数中1的个数的方法,遍历1到n求其中1的个数相加即可。public class ...原创 2018-04-09 21:16:24 · 100 阅读 · 0 评论 -
冒泡排序
private static int[] bubbleSort(int[] array){ if(array!=null&&array.length>1){ for(int i=array.length-1;i>0;i--){ for(int j=0;j<i;j++){ ...原创 2018-03-15 22:43:01 · 104 阅读 · 0 评论 -
算法题
冒泡排序选择排序树型选择排序快速排序堆排序二分法查找重建二叉树两个栈实现队列斐波那契数列二进制中1的个数数值的整数次方调整数组顺序使奇数位于偶数前面链表中倒数第k个结点二叉树的遍历不使用*和/完成两个数的乘除法反转链表...原创 2018-03-15 21:37:37 · 195 阅读 · 0 评论 -
学习笔记之Java
基本数据类型 java中有八种基本数据类型 int(4字节),short(2字节),long(8字节),byte(1字节),float(4字节),double(8字节),char(2字节),boolean(1字节)。 三种引用数据类型 类(class),接口(interface),数组。java命名规则首字母是英文字母、$和下划线,由字母、数字和下划...原创 2018-03-09 14:19:08 · 157 阅读 · 0 评论 -
java表达式陷阱
int a = 10; int b = a + (a = 5) + a + (a = 10); //10+5+5+10 先算括号 System.out.println(b);//b = 30 int i = 1; i = (i=i+(i+(i=2)+i)+i)+3; //1+1+2+2+2+3 System.out.println(原创 2018-01-29 17:28:18 · 169 阅读 · 0 评论 -
关于多线程,volatile,工作内存,主内存
看这两篇博客关于volatile主内存和工作内存原创 2018-01-19 17:34:31 · 594 阅读 · 0 评论 -
<<,>>和>>>
右移运算符>>(有符号)用来将一个数的各二进制位全部右移若干位.例如:a = a>>2,使a的各二进制位右移两位,移到右端的低位被舍弃,最高位则移入原来高位的值. (正数右移是正数,负数右移是负数)如:a = 00110111,则a>>2=00001101,b=11010011,则b>>2 = 11110100 右移一位相当于除2 取商,而且用右移实现除法比除法运算速度要快 左移运算符同上,末位补原创 2018-01-18 15:16:45 · 2399 阅读 · 1 评论 -
代理模式
代理模式的用途代理模式是对类的扩展比如有一个字体提供类,有多种实现(从磁盘,从网络,从系统)public interface FontProvider { Font getFont(String name);}public abstract class ProviderFactory { public static FontProvider getFont原创 2018-01-15 09:57:18 · 132 阅读 · 0 评论 -
Java中的垃圾回收
GC 的职责1.分配内存2.确保有引用的对象保留在内存中3.回收不能通过引用关系找到的对象的内存.JVM使用分代式的内存管理方式, 将Heap分成三代 --- 新生代, 老一代, 持久代.新生代分为Eden space, Survivor 0 和 Survivor 1 三个部分.新生代对应小GC老一代对应大GC小GC执行频繁,大GC执行时间间隔一般是小G原创 2018-01-15 09:40:35 · 99 阅读 · 0 评论 -
ClassLoader
JAVA自带的ClassLoaderBootStrapClassLoader:最顶层类加载器,用于加载lib目录下的rt.jar,resource.jar,charset.jar等核心类库。是用C/C++实现的。ExtentionClassLoader:扩展的类加载器,用于加载lib/ext目录下的jar包和class文件。AppClass Loader(SystemAppClass)原创 2018-01-22 17:50:28 · 115 阅读 · 0 评论 -
关于编码,摘要
Base64编码 Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。 Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。 规则 关于这个编码的规...原创 2018-03-03 17:08:32 · 313 阅读 · 0 评论 -
快速排序
思路:首先找到一个基准数。然后定义两个游标,分别将从数组两头到中间的各数与基准数进行比较,目的在于一趟下来比基准数小的都在基准数左边,比基准数大的都在基准数右边,然后以基准数的下标为界将数组分为两个部分,再对数组进行递归,最终得到有序的完整数组。时间复杂度:O(n) = nlogn; 传送门private static int[] quickSort(int[] array,int star...原创 2018-03-17 21:37:30 · 136 阅读 · 0 评论 -
连续子数组的最大和
题目:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少...原创 2018-04-09 20:10:19 · 80 阅读 · 0 评论