![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java算法题
不知其所以然
这个作者很懒,什么都没留下…
展开
-
笔试-给出一个字符串输出所有的排序可能(java)
1. 目的最近笔试经常遇到这样的题目,或者类似的这样的题目,但是经常不知怎么做(有毒),所以特意来此记录一下做法。2. 代码(别人的代码)import java.util.Scanner;public class Main { //以chars数组的n号位置作为交换点,向后交换 public static void paiLie(int n,char[] chars){ //递归出口:只剩一个字符,即无法交换 if (n==chars.length-原创 2020-10-15 22:04:48 · 513 阅读 · 0 评论 -
剑指Offer:二叉树的镜像(java)
1. 题目描述2. 解题思路(1)用栈来做把,记录前一个结点,然后先从左边开始遍历,然后交换,再到右边开始,重复遍历即可。3. 代码实现(1)public class Solution { public void Mirror(TreeNode root) { if (root == null) return; Stack<TreeNode> stack = new Stack<>(); wh原创 2020-08-03 00:07:26 · 97 阅读 · 0 评论 -
剑指Offer:顺时针打印矩阵(java)
1. 题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.2. 解题思路其实大概就是从四个方向遍历,但是处理索引的时候,要额外搞搞了(我也是看答案的,我太菜了!!!)3. 代码实现import java.util.ArrayList;public class Soluti原创 2020-08-02 00:02:36 · 89 阅读 · 0 评论 -
剑指Offer:包含min函数的栈(java)
1. 题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。2. 解题思路(1)可以声明两个栈,一个栈放所有的元素,一个栈放比所有元素都小的元素,到时候取出的时候,取最小即可。(2)。。变形一下。3. 代码实现(1)import java.util.Stack;public class Solution { private static Stack<Integer> stack = new Stack<>原创 2020-07-30 19:29:58 · 93 阅读 · 0 评论 -
剑指Offer:栈的压力、弹出序列(java)
1. 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2. 解题思路(1)从题目可以知道这是一个栈知识,所以一开始我们可以声明一个容器(栈),具体做法就是第一次遍历第一个数组,同时对比它们是否相同,最后再遍历一次比较它们是否相同即可。(2)大原创 2020-07-29 21:23:03 · 99 阅读 · 0 评论 -
剑指Offer:从上往下打印二叉树(Java)
1. 题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。2. 解题思路(1)一般都是用队列来做广度遍历,存储一个结点的同时,也存储它的左右结点即可。(2)。。。3. 代码实现(1)public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList<Integer> arrayList = new ArrayL原创 2020-07-29 19:40:56 · 88 阅读 · 0 评论 -
剑指Offer:二叉搜索树的后序遍历序列(java)
1. 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2. 解题思路(1)感觉这道题有点像看规律,哈哈,后序遍历其实第一个元素就是二叉树最左边的,所以它是最小的。最后一个元素是根节点,故正常情况下数组会出现一半比它大,一半比它小的情况。(2)。。。思考官方答案。3. 代码实现(1)public class Solution { public boolean VerifySquenceOfB原创 2020-07-28 22:59:04 · 124 阅读 · 0 评论 -
剑指Offer:二叉树中和为某一值的路径(java)
1. 题目描述输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2. 解题思路(1)最普遍的实现就是,遍历二叉树的时候,把所有的遍历结果都记录下来,然后递归调用,要注意条件的判断,最后的时候要移除重复。(2)3. 代码实现(1)public class Solution { private ArrayList<ArrayList<Integer>> arr1原创 2020-07-28 22:16:40 · 111 阅读 · 0 评论 -
剑指Offer:复杂链表的复制(java)
1. 题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2. 解题思路(1)一开始打算进行两次的遍历,第一次遍历的时候,复制所有的结点,第二次遍历的的时候复制所有的随机结点,最后返回头结点即可。(但是我写代码的时候,出现点错误,有毒!!)(2)网上比较多的做法:先复制链表的next节点,将复制后的节点接在原节点原创 2020-07-27 21:55:07 · 90 阅读 · 0 评论 -
剑指Offer:二叉搜索树与双向链表(java)
1. 题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2. 解题思路(1)要充分利用递归思想,把每个左右指针改向。遍历双向链表,然后返回头结点。(2)。。。3. 代码实现(1)public class Solution { public TreeNode Convert(TreeNode pRootOfTree) { TreeNode lastlist = covertNode(pRootOfTr原创 2020-07-26 23:18:12 · 63 阅读 · 0 评论 -
剑指Offer:字符串的排列(java)
1. 题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。2. 解题思想(1)主要是对字符进行交换。3. 代码实现(1)import java.util.ArrayList;import java.util.Arrays;public class Solution {原创 2020-07-25 23:17:59 · 96 阅读 · 0 评论 -
剑指Offer:数组中出现次数超过一半的数字(java)
1. 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2. 解题思路(1)遍历数组的时候,要注意将他们记录下来,特别是重复的数字,如果超过一半的话,很多事情都比较好办了。(2).。。3. 代码实现(1)public class Solution { public int MoreThanHalfNum_Solution原创 2020-07-25 22:00:54 · 67 阅读 · 0 评论 -
剑指Offer:最小的K个数(java)
1. 题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。2. 解题思路(1)可以先排序数组,然后再把前n个数字放到集合中,返回集合即可。(2)也可以用堆的思想去做,先将前K个数放入数组,进行堆排序,若之后的数比它还小,则进行调整。3. 代码实现(1)import java.util.ArrayList;public class Solution { public ArrayList<Integer原创 2020-07-24 22:31:01 · 74 阅读 · 1 评论 -
剑指Offer:连续子数组的最大和(java)
1. 题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)2. 解题思路(1)如果和小于0,则将大和置为当前值原创 2020-07-23 22:05:42 · 76 阅读 · 0 评论 -
剑指Offer:不用加减乘除做加法(java)
1. 题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2. 解题思想(1)最近的脑袋有点不想思考,经常想参考别人的一些答案。(2)其实如果不能让你做加减乘除的运算的话,就只能做一些化为二进制做一些为运算了。3. 代码实现(1)。。。(2)public class Solution { public int Add(int num1,int num2) { while(num2 != 0){ // 计算个位原创 2020-07-22 21:49:44 · 84 阅读 · 0 评论 -
剑指Offer:把字符串转为整数
1. 题目描述+21474836471a33214748364702. 解题思路(1)今晚太累了,不太想动脑了,就看了一下别人的思路:若为负数,则输出负数,字符0对应48,9对应57,不在范围内则返回false。(2)…代码实现(1)public class Solution { public int StrToInt(String str){ if (str == null || str.length() == 0)原创 2020-07-21 23:26:56 · 60 阅读 · 0 评论 -
剑指Offer:把数组排成最小的数(java)
1. 题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。2. 解题思路(1)看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排在前面。3. 代码实现(1)import java.util.Arrays;publ原创 2020-07-18 17:08:05 · 116 阅读 · 0 评论 -
剑指Offer:丑数(java)
1. 题目描述把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。2. 解题思路(1)本题的思路最好反过来思考就好,不要想着给出一个数然后求它所有的因子。因为我们知道所有的质因子了,所有可以用质因子求出所有的丑数即可。3. 代码实现(1)public class Solution { public int GetUglyNumber_Solution(int原创 2020-07-18 16:35:25 · 102 阅读 · 0 评论 -
剑指Offer:第一次只出现一次的字符(java)
1. 题目描述在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)2. 解题思路(1)直接遍历比较即可。(注意判断条件即可)(2)利用LinkedHashMap保存字符和出现次数。(果然大哥牛逼)3. 代码实现(1)public class Solution { public int FirstNotRepeatingChar(String str) {原创 2020-07-14 22:36:55 · 85 阅读 · 0 评论 -
剑指Offer:数组中的逆序对(java)
1. 题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007输入描述:2. 解题思路(1)看完题意以后,头脑只有遍历,然后实现看看,发现超时(卑微码农),在线被虐。(2)看一下比较官方的答案,说该题本质上就是归并排序(神TM),,在比较时加入全局变量count进行记录逆序对的个数,若data[start] >= data[index]原创 2020-07-14 21:55:22 · 157 阅读 · 0 评论 -
剑指Offer:两个链表的第一个公共结点(java)
1. 题目描述输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)如:2. 解题思路(1)其实一看题目,应该有很多人第一个想法就是暴力解题,但是复杂度很大很大了。(2)也可以把其中一个链表放进一个容器中,如Map,这样的话复杂度就大大减少了(空间换时间的一种做法)。(3)先求出链表长度,然后长的链表先走多出的几步,然后两个链表同时向下走去寻找相同的节点,代码量 少的方法需要将两个链表遍历两次,然后从头开始相同的节点。原创 2020-07-13 14:10:17 · 121 阅读 · 0 评论 -
剑指Offer:统计一个数字在排序数组中出现的次数。(java)
题目描述统计一个数字在排序数组中出现的次数。解题思路(1)直接遍历完事。(2)二分查找代码实现(1) public class Solution { public int GetNumberOfK(int [] array , int k) { int len = array.length; if(len < 1) return 0; int count =0; for(int ..原创 2020-07-13 09:58:58 · 349 阅读 · 1 评论 -
剑指Offer:平衡二叉树(java)
1. 题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树2. 解题思路(1)一看到题目,首先考虑什么是平衡二叉树,然后结合题目可以知道只需要判断左右子树距离根结点的大小即可。(平衡二叉树左右子树高度差不超过 1。)(2)。。。3. 代码实现(1)public class Solution { private boolean result = true; public boolean IsBalanced_Solu原创 2020-07-12 22:31:05 · 90 阅读 · 0 评论 -
剑指Offer:正则表达式匹配(java)
1. 题目描述请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配2. 解题思路(1)题意就是让我们比较两个式子是否相同,一个为字符串,一个为模式(正则表达式)。a、模式后移2字符,相当于x被忽略;b、字符串后移 1字符,模式后移2字符;c、字符串后移1字符,模式原创 2020-07-12 21:47:18 · 124 阅读 · 0 评论 -
剑指Offer:字符串的排列(java)
1. 题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。2. 解题思路(1)?(2)将当前位置的字符和前一个字符位置交换,递归。3、代码实现(1)坐等大侠可以,献计。(2)import java.util.ArrayList;import java.util.TreeSet;public class Solution { private Ar原创 2020-06-15 00:18:30 · 119 阅读 · 0 评论 -
程序员面试金典:链表中倒数第k个结点(java)
1. 题目描述输入一个链表,输出该链表中倒数第k个结点。2. 解题思路(1)遍历整个链表算出总共有n个结点,然后n-k就是顺序遍历的个数了。(2)声明两个指针,慢指针等到快指针跑到第k个的时候,慢指针开始跑。快指针跑到终结点的时候,慢指针就到了倒数第k个。3. 代码实现(1)public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(k < 1 || head =原创 2020-06-14 21:35:21 · 112 阅读 · 0 评论 -
程序员面试金典:清除行列(java)
1. 题目描述请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。给定一个N阶方阵int[]mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。测试样例:2. 解题思路(1)一开始我想到,直接new一个二维数组,初始化为原来二维数组的值,然后遍历任一数组找出0,最后在另外的数组上把行和列赋值0.(2)可以首先遍历二维数组,然后把每一行每一列是0的情况记录下来,然后再根据每一行每一列的记录情原创 2020-06-13 00:12:41 · 209 阅读 · 0 评论 -
剑指Offer:二叉搜索树与双向链表(java)
1. 题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2. 解题思路(1)使用中序遍历的过程中处理树结点左右指向的问题。(2)用集合存储中序遍历结果,再连接成双向链表(但实验超时)3. 实验代码(1)public class Solution { private TreeNode pre = null; private TreeNode head = null; public TreeN原创 2020-06-12 10:57:55 · 65 阅读 · 0 评论 -
程序员面试金典:像素反转(java)
1. 题目说明有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时针旋转90度。给定一个NxN的矩阵,和矩阵的阶数N,请返回旋转后的NxN矩阵,保证N小于等于500,图像元素小于等于256。测试样例:2. 解题思路(1)一开始如果没有说明不能使用缓存矩阵的时候,大家应该都会想到直接new一个新的矩阵出来,然后遍历原矩阵在放在合适的位置即可。但有要求??没办法只能看第二种方法。(2)其实细心的人可以发现只要把矩阵原创 2020-06-11 23:06:30 · 230 阅读 · 0 评论 -
剑指Offer:复杂链表的复制(java)
1. 题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)2. 解题思路(1)可以考虑开始的时候在每个节点的后面插入复制的节点,然后对对复制节点的 random 链接进行赋值,最后拆分链表。(2)先复制链表的next节点,将复制后的节点接在原节点后,然后复制其它的节点。这个思路简单点。3.代码实现(1)pu原创 2020-06-11 14:33:47 · 80 阅读 · 0 评论 -
剑指Offer:二叉树中和为某一值的路径(java)
1. 题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。2. 解题思路(1)主要思路就是遍历二叉树的同时用集合记录下遍历走过的路径,同时判断是否是“尽头”。(2)先保存根节点,然后分别递归在左右子树中找目标值,若找到即到达叶子节点,打印路径中的值。3. 实现思路(1)public class Solution { private ArrayList<ArrayList<原创 2020-06-11 13:11:03 · 99 阅读 · 0 评论 -
剑指Offer: 二叉搜索树的后序遍历序列(java)
1. 题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2. 解题思路(1)根据二叉搜索树和后序遍历的特性可知,数组的最后一个值是根节点,然后根据此值可找出左右子树,递归此过程即可。(2)实现版本23. 代码实现(1)public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if原创 2020-06-08 13:06:21 · 81 阅读 · 0 评论 -
剑指Offer:从上往下打印出二叉树的每个节点,同层节点从左至右打印(java)
从上往下打印二叉树。1. 题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。2. 解题思路(1)可以用一个队列来模拟从上到下打印的过程,在数据结构中它也被称为广度遍历。操作的过程中要注意从队列中移除结点的同时把它的左右结点以进队列中。(2)…实现方法23. 代码实现(1)import java.util.*;/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode ri原创 2020-06-06 09:39:04 · 262 阅读 · 0 评论 -
剑指Offer:栈的压入和弹出序列(java)
1. 题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)2. 解题思路(1)可以用栈的结构模拟“过程”,直接遍历pushA数组,把一开始没有匹配的数据压入栈中,然后把栈中的数据和剩下的数据比较即可。(2)用栈来压入弹出元素,相等则出栈。3.原创 2020-06-05 09:07:32 · 148 阅读 · 0 评论 -
剑指Offer:包含min函数的栈(java)
1. 题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。2. 解题思路(1)可以用两个栈,一个栈用于存储最小值,另外一个栈存储放入的元素。(2)。。。3. 代码实现(1)代码实现版本1import java.util.Stack;public class Solution { private Stack<Integer>原创 2020-06-04 13:25:34 · 79 阅读 · 0 评论 -
剑指Offer:顺时针打印矩阵(java)
1. 题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.2. 解题思路(1)可以用迭代的方法,从四个方向分别遍历二维数组(2)”函数“实现。3. 代码实现(1)import java.util.ArrayList;public class Solution {原创 2020-06-03 23:19:05 · 128 阅读 · 0 评论 -
剑指Offer:二叉树的镜像(java)
1. 题目描述操作给定的二叉树,将其变换为源二叉树的镜像。2. 解题思路(1)从输入描述可以看的出来,树的结构是左右子树交换了位置。这个时候就可以看作三个结点的根节点的左右交换的问题,然后递归即可。(2)非递归实现.3. 代码实现(1)public class Solution { public void Mirror(TreeNode root) { if (root == null) return; swap(root)原创 2020-06-03 11:44:57 · 70 阅读 · 0 评论 -
剑指Offer:树的子结构(java)
1. 题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)2. 解题思路(1)求树的子结构,首先比较它们的根节点,如果相同就继续比较其他结点,否则就继续找其他结点是否与根节点相同。递归实现。(2)。。。递归实现版本2。3. 代码实现(1)public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 ==原创 2020-06-03 11:00:55 · 90 阅读 · 0 评论 -
剑指Offer:合并两个排序的链表(java版)
1. 题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。2. 解题思路(1)可以用迭代的方法,其实就是比较,找出最小的。(2)可以用递归的方法,把链表中数比较小的放在前面,大的放在后面。3. 代码实现(1)public class Solution { public ListNode Merge(ListNode list1,ListNode list2) { ListNode head = new ListNode(0原创 2020-06-02 23:35:56 · 116 阅读 · 0 评论 -
剑指Offer:反转链表(java)
1. 题目描述输入一个链表,反转链表后,输出新链表的表头。2. 解题思路(1)可以用两个指针改变指向,就是让下一个指向上一个,遍历整个链表即可。此方法时间复杂度相对好点O(n)。也可以用递归实现,我考虑资源浪费情况就用循环了。(2).。。。3. 代码实现(1)public class Solution { public ListNode ReverseList(ListNode head) { if (head == null){ return n原创 2020-06-02 22:41:50 · 106 阅读 · 0 评论