编程题
叽歪丶
这个作者很懒,什么都没留下…
展开
-
[剑指offer]和为S的两个数字
思路:题目是递增排序,可以直接用两个指针一个指向头一个指向尾,遍历数组将两个指针对应的数的和作比较,和目标数相等就添加到list中,小于目标数则将头指针后移,大于目标数则将尾指针前移,至于如果有多对数字的和都等于目标数的情况,可以不用考虑,因为头尾指针这种方法遇到的第一组数的乘积就是最小的实现:import java.util.ArrayList;public class Solutio...原创 2018-12-18 18:32:12 · 113 阅读 · 0 评论 -
[剑指offer]整数中1出现的次数
思路:把每个数转成String,判断有几个1就行实现:public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int sum = 0; for(int i = 1 ; i <= n ; i++){ String str = St...原创 2018-12-05 22:04:31 · 116 阅读 · 0 评论 -
[剑指offer]平衡二叉树
思路:遍历每个节点,借助一个获取树深度的递归函数,根据该节点的左右子树高度差判断是否平衡,然后递归地对左右子树进行判断。实现:public class Solution { public boolean IsBalanced_Solution(TreeNode root) { return getDept(root) != -1; } private...原创 2018-12-12 17:43:55 · 95 阅读 · 0 评论 -
[剑指offer]第一个只出现一次的字符
思路:遍历str字符串,使用hashmap进行保存字符value值为1,如果找到重复的字符就将其value变为2,完成之后遍历str字符串判断在map中的value值,结果为1则符合题意返回实现:import java.util.HashMap;public class Solution { public int FirstNotRepeatingChar(String str)...原创 2018-12-08 18:53:55 · 98 阅读 · 0 评论 -
[剑指offer]丑数
思路:一个丑数只有因子2,3,5,那么一个丑数一定由另一个丑数乘以2,3,5得到。那么从1开始乘以2,3,5,就得到2,3,5,从2,3,5开始乘以2,3,5,分别得到4,6,10,6,9,10,10,15,25九个丑数。但是此序列是无序且有重复的。这里判断乘以2,3,5一次之后最小的数,将此最小的数加入list容器中,如果此最小的数等于乘以2,3,5之后的任一数,就将此数对应的2或3或5的变...原创 2018-12-07 22:47:11 · 81 阅读 · 0 评论 -
[剑指offer]二叉树中和为某一值的路径
思路:1、在计算时注意前面的路径已经计算过,不用再次计算,可以创建一个全局变量来保存。2、计算时先将结点的值val保存在list中,再用给定的target减去val再存到target中。在左子树和右子树中重复这个步骤,在遍历完要注意要回退一下,因为递归到叶子节点如果还没有找到路径的话,就要回退到前一个节点(父节点)继续寻找。3、递归出口要注意以当前的list的数据重新创建一个新的list,...原创 2018-12-01 22:05:13 · 122 阅读 · 0 评论 -
[剑指offer]把数组排成最小的数
思路:用两种组合两两比较两个数,例如32 23,排序为2332小于3223,就把这两个数原本的位置交换,最后将小的放在前面实现:import java.util.ArrayList;public class Solution { public String PrintMinNumber(int [] numbers) { String str = ""; ...原创 2018-12-04 23:52:26 · 173 阅读 · 0 评论 -
[剑指offer]数组中出现一半的数字
思路:方法一:用hashmap保存数字以及出现的次数,遍历数组,找到该数字时就将value+1,在遍历前判断value值是否大于数组长度的一半方法二:先对数组排序,在数组中间的数即为所求的数实现:方法一:import java.util.HashMap;public class Solution { private HashMap<Integer,Integer&g...原创 2018-12-02 23:25:23 · 98 阅读 · 0 评论 -
[剑指offer]二叉搜索树的后序遍历序列
思路:后序序列最后一个元素是根节点,遍历序列找到第一个大于根节点的位置,将数组分成左右两个部分,左侧部分都小,右侧部分都大。如果右侧部分有比根节点小的元素,那就不是后序遍历。将上述步骤递归实现实现:public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(seque...原创 2018-11-30 00:31:34 · 87 阅读 · 0 评论 -
[剑指offer]字符串的排列
思路:使用递归逐个交换,注意交换完后开始新的交换时需要恢复交换之前的状态,即回溯A和A交换,A和B交换,A和C交换,之后再分别进行各自的不同交换,在交换记录之后回到上一次交换时的状态。实现:import java.util.ArrayList;import java.util.Collections;import java.util.List;public class Solut...原创 2018-12-03 23:57:28 · 98 阅读 · 0 评论 -
[剑指offer]数字在排序数组中出现的次数
思路:直接遍历,或者用二分法,这里用二分法,因为是现成的有序序列实现:public class Solution { public int GetNumberOfK(int [] array , int k) { int length = array.length; if(length == 0){ return 0; ...原创 2018-12-13 15:29:40 · 97 阅读 · 0 评论 -
[剑指offer]数组中只出现一次的数字
思路:把该数组中元素放进hashmap里,放的时候判断hashmap中是否有重复元素,如果有就改一下value值,再遍历一次数组查找hashmap中有哪两个数的value没有改变就是了实现://num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.HashMap;public class Solution ...原创 2018-12-11 17:10:56 · 108 阅读 · 0 评论 -
[剑指offer]和为S的连续正数序列
思路:双指针技术:相当于有一个窗口,窗口的左右两边就是两个指针,根据指针内值的和来确定窗口的位置和宽度。具体方法是直接创建两个数,先求这两个数之间的和,如果这两个数之间的和大于目标数,就让窗口左侧的数自加(缩短窗口),相反如果和小于目标数,就让窗口右侧的数自加(扩充窗口),直到相等则把窗口中的数都加入一个list,再把list加入result,完成后还要把窗口左侧向右移动一格,为了避免重复统...原创 2018-12-17 11:27:57 · 110 阅读 · 0 评论 -
[剑指offer]最小的K个数
思路:使用优先级队列(最大堆)保存这K个数,每次只和堆顶比,如果比顶堆小就删除堆顶,新数入堆,在堆大小等于K时就不用加入数了,直接将堆中的数都add进list中实现:import java.util.ArrayList;import java.util.Comparator;import java.util.PriorityQueue;public class Solution {...原创 2018-12-16 11:10:10 · 97 阅读 · 0 评论 -
[剑指offer]两个链表的第一个公共结点
思路:把一个链表结点存到hashmap里,遍历另一个链表对hashmap对象使用containskey方法判断即可实现:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java...原创 2018-12-10 15:55:54 · 112 阅读 · 0 评论 -
[剑指offer]数组中的逆序对
思路:可以看成归并排序,两两比较之后存入数组并排序,存储该逆序对的数量实现:public class Solution { public int InversePairs(int [] array) { if(array == null || array.length <= 0) return 0; int pairsNum = mergeSo...原创 2018-12-09 22:16:33 · 92 阅读 · 0 评论 -
[剑指offer]二叉搜索树与双向链表
思路:先用中序遍历树,并存入栈中。如果是第一个节点就记为root,保存两个节点一前一后,将前一个节点的右节点和后一个节点的左节点交换实现:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val)...原创 2018-12-14 22:38:20 · 134 阅读 · 0 评论 -
[剑指offer]左旋转字符串
思路:怎么做也行,这里按照题目进行真的循环移动,通过建立一个char数组实现:public class Solution { public String LeftRotateString(String str,int n) { char[] chars = str.toCharArray(); if(chars.length < n) retu...原创 2018-12-19 18:01:58 · 179 阅读 · 0 评论 -
[剑指offer]连续子数组的最大和
思路:寻找连续子序列和最大的子序列。设置两个参数,一个保存当前序列值,另一个保存最大序列值,当前序列值小于0时,让序列值重新计数。为正数时继续累积,如果比最大序列值还大就记录当前值为最大序列值。实现:public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array...原创 2018-12-06 18:36:37 · 128 阅读 · 0 评论 -
[剑指offer]包含min函数的栈
思路:使用两个栈,一个主栈存放数据,另一个辅助栈存放最小值,每次push数据时先与辅助栈栈顶元素进行比较,如果小于或等于辅助栈栈顶元素则在push进主栈同时push进辅助栈。要注意在pop删除主栈元素时要同时判断辅助栈栈顶元素是否和主栈栈顶元素相等,相等则同时pop删除,否则原有的最小值不会被删除。实现:import java.util.Stack;public class Solut...原创 2018-11-17 19:44:59 · 108 阅读 · 0 评论 -
[剑指offer]顺时针打印矩阵
思路:先规定好四个角的位置,再按照题目的顺序遍历添加元素,每遍历完一圈,四个角也同时做相应的操作实现缩小一圈,在四个角上下左右都到一个点时遍历完毕。实现:import java.util.ArrayList;public class Solution { public ArrayList&lt;Integer&gt; printMatrix(int [][] matrix) {...原创 2018-11-17 18:55:14 · 108 阅读 · 1 评论 -
[剑指offer]斐波那契数列
思路:实现:递归:public class Solution { public int Fibonacci(int n) { return Fibonaccis(n,0,1); } public static int Fibonaccis(int n,int num1,int num2){ if(n==0)return 0; ...原创 2018-11-07 19:35:21 · 141 阅读 · 0 评论 -
[leetcode]两个数组的交集II
个人解法class Solution { public int[] intersect(int[] nums1, int[] nums2) { HashMap&lt;Integer,Integer&gt; map=new HashMap&lt;Integer,Integer&gt;(); List&lt;Integer&gt; list=new Arra...原创 2018-11-02 21:57:24 · 150 阅读 · 0 评论 -
[leetcode]只出现一次的数字
个人解法class Solution { public int singleNumber(int[] nums) { Arrays.sort(nums);//先排序 if(nums.length==1)return nums[0]; for(int i=0;i<nums.length-1;){ if(nums...原创 2018-11-02 18:25:41 · 110 阅读 · 0 评论 -
[leetcode]旋转数组
解法一每次一步,循环k次class Solution { public void rotate(int[] nums, int k) { for(int q=0;q&lt;k;q++) for(int i=nums.length-1;i&gt;0;i--){ int temp=nums[i]; ...原创 2018-11-02 16:17:17 · 105 阅读 · 0 评论 -
[剑指offer]旋转数组的最小数字
思路:数组实际是两组有序序列,先用两个指针分别指向头和尾,如果左大于右,说明较大的数列在左边,用middle指向中间的值,如果中间值大于left,就将left设为中间值,如果中间值小于right,就将right设为中间值,最后中间值即为最小值实现:import java.util.ArrayList;import java.util.*;public class Solution {...原创 2018-11-06 21:47:14 · 105 阅读 · 0 评论 -
[剑指offer]用两个栈实现队列
思路:进行队列的push操作时,直接将元素push进stack1即可,Pop操作先判断stack2中有无元素,如果有直接pop,没有就将stack1中元素pop并push进stack2中,再进行pop操作即可实现:import java.util.Stack;public class Solution { Stack<Integer> stack1 = new St...原创 2018-11-06 19:54:05 · 94 阅读 · 0 评论 -
[剑指offer]重建二叉树
思路:实现:/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */import java.util.*;publ...原创 2018-11-06 19:30:45 · 109 阅读 · 0 评论 -
[剑指offer]从尾到头打印链表
思路:创建静态全局变量arraylist,用递归找到最后一个元素,找到后依次加入arraylist。实现:/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;*...原创 2018-11-06 16:24:21 · 100 阅读 · 0 评论 -
[剑指offer]跳台阶
思路:跳一节有一种,跳两节有两种,跳三节有f(1)+f(2)种,跳N节有f(N-1)+f(N-2)种,就是一个斐波那契数列。实现:public class Solution { public int JumpFloor(int target) { if(target<=2)return target; int n1=1; int...原创 2018-11-07 19:39:12 · 109 阅读 · 0 评论 -
[剑指offer]变态跳台阶
思路:用f(n)表示有一次跳n节的方法种数n为1时有f(1)种,n为2时有f(2-1)+f(2-2)种,n为3时有f(3-1)+f(3-2)+f(3-3)种n节时,f(n)=f(n-1)+f(n-2)+···+f(n-n),f(n-1)=f(n-1)+f(n-2)+···+f(n-(n-1))化简为 f(n)=f(1)+f(2)+···+f(n-1)=2*f(n-1)实现:publi...原创 2018-11-07 20:13:59 · 93 阅读 · 0 评论 -
[剑指offer]二叉树的深度
思路:使用递归方法,先定义出口。在遍历到null时表示到底返回0,在root节点的左右子树都为空时是最低一层返回1,对左子树和右子树分别使用递归进行上述遍历,以左右子树节点代替原来的root节点,最后判断左子树还是右子树深度深,返回最深的。实现:/**public class TreeNode { int val = 0; TreeNode left = null; ...原创 2018-11-19 22:07:19 · 105 阅读 · 0 评论 -
[剑指offer]树的子结构
思路:按着根节点向下逐个比较,如果A树走到头还没有和B相等的子结构就返回false,没有就继续进行A的左子树遍历,A的左子树要进行和之前差不多的操作,不过要和B的左子树进行比较,右子树同理,只要有一个不相同就返回之前的左子树节点向下继续遍历查找。如果B子树能查找直到null,说明B是A的子结构。实现:/**public class TreeNode { int val = 0;...原创 2018-11-17 10:35:40 · 75 阅读 · 0 评论 -
二叉树的各种遍历方式
class TreeNode{ TreeNode root; TreeNode left; TreeNode right; int val;}public class TreeNodeGo{ //先序遍历(递归) public void PrePrintTreeNode(TreeNode root){ if(root!=null){ System.out.Println(...原创 2018-11-19 15:45:36 · 158 阅读 · 0 评论 -
[剑指offer]链表中倒数第k个节点
思路:用两个指针遍历,先让快指针出发,当快指针走过k+1个元素时,慢指针开始移动,直到快指针指向null,慢指针指向的节点即为倒数第k个节点。实现:/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}...原创 2018-11-16 21:12:32 · 83 阅读 · 0 评论 -
[剑指offer]二进制中1的个数
思路:用1一直左移运算,和n的每位进行与运算,因为左移运算结果都为2的倍数,与运算结果不为0则说明有二进制表示有1。需要注意的是如果直接用n进行运算,如if((n&1)==1),之后还用n=n>>1的,如果为负数,经过右移最后一位就会变成1,而这就会陷入死循环。实现:public class Solution { public int NumberOf1(in...原创 2018-11-16 20:32:55 · 74 阅读 · 0 评论 -
[剑指offer]矩形覆盖
思路:用归纳法n=1时,return 1n=2时,return 2n=2以上时,分两步考虑第一次摆放一块21,占了一格,所以有f(n-1)种摆法第一次摆放一块12,占了两格,因为上方摆放了一个12,下方就确定只能放12了,所以有f(n-2)种摆法可得f(n)=f(n-1)+f(n-2),是一个斐波那契数列实现:和斐波那契数列一模一样,只需要改一下起始数值,本题n=1时f...原创 2018-11-16 20:16:45 · 96 阅读 · 0 评论 -
[剑指offer]二叉树的镜像
思路:找到左子树和右子树直接交换,再使用左子树节点和右子树节点作为参数进行递归实现:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;...原创 2018-11-16 18:33:37 · 76 阅读 · 0 评论 -
[剑指offer]重构二叉树
思路:前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。实现:/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; ...原创 2018-11-08 08:45:34 · 138 阅读 · 0 评论 -
[剑指offer]二维数组的查找
思路:矩阵有序,从左下角看,向上为递减,向右为递增,把target和左下角的数比较,大于则右移,小于则上移public class Solution { public boolean Find(int target, int [][] array) { int rc=array.length; int cc=array[0].length; ...原创 2018-11-06 15:53:41 · 132 阅读 · 0 评论