java-剑指offer
剑指offer中的题
小小Java人
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 30. 包含min函数的栈
题目说明:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。题目链接:https://leetcode.cn/problems/bao-han-minhan-shu-de-zhan-lcof/原创 2023-03-23 23:19:21 · 111 阅读 · 0 评论 -
剑指offer 09.用两个栈实现队列
剑指offer 09原创 2023-03-23 22:13:24 · 131 阅读 · 0 评论 -
2021-03-08
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323.分析:实际上就是把这个数组排下序。但是这个排序有点特殊。要按特定排序将 '小' 的数放前面.import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;public class Solution {...原创 2021-03-08 10:02:46 · 101 阅读 · 0 评论 -
求1到n的整数中出现1的次数
若求出1~13的整数中1出现的次数,那么包括1的数有1、10、11、12、13。因此共出现6次分析:我们要求1到n的整数中出现1的次数。思路是分别计算个位、十位、百位........上出现 1 的个数。以 n =216为例:个位上: 1 ,11,21,31,.....211。个位上共出现(216/10)+ 1个 1 。因为除法取整,210~216间个位上的1取不到,所以我们加8进...原创 2020-04-20 13:36:31 · 171 阅读 · 0 评论 -
求连续子数组的最大和
举例:{6,-3,-2,7,-15,1,2,2} 的连续子数组的最大和为8。从第0个开始,到第3个为止。方法一和方法二都采用递归解法。方法一:循环解法:public class Solution { public int FindGreatestSumOfSubArray(int[] arr) { return func(arr); } ...原创 2020-04-13 18:10:14 · 178 阅读 · 0 评论 -
用递归实现全排列
给定一个字符串,输出其所有的全排列思路:假设字符串的长度为1,则输出该字符 假设字符串的长度为2,则交换字符1和字符2 假设字符串的长度为n,则交换字符1和字符i(1<i<n) 剩下的长度为n-1的字符串继续用该方法进行递归。代码实现:package com.hy;import java.util.ArrayList;import java.util.Array...原创 2020-04-07 15:05:50 · 401 阅读 · 0 评论 -
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
找出一个数组中的最小的k个数思路:1.先对前k个数进行排序2.使用插入排序的思想将后面的小元素插入到前k个数中3.返回前k个数import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] arr, i...原创 2020-04-07 11:45:27 · 417 阅读 · 0 评论 -
输入一棵二叉搜索树,将树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题目链接:点击此处飞至原题方法一:1.将二叉搜索树中序遍历出来,并把每个节点都保存在一个list中2.改变list中每个元素的指向/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val...原创 2020-04-03 17:54:51 · 238 阅读 · 0 评论 -
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在
方法一:使用map存储每个元素出现的个数import java.util.*;public class Solution { public int MoreThanHalfNum_Solution(int [] arr) { HashMap<Integer,Integer> map=new HashMap<Integer,Integer>()...原创 2020-03-22 01:50:35 · 299 阅读 · 0 评论 -
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序
方法一:分析:1.复制各个节点,使得原来的各个节点的next指向复制的节点2.复制各个节点的random节点3.把新旧节点分离注意:不能破坏给出的节点的结构/*public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = n...原创 2020-03-22 00:22:53 · 154 阅读 · 0 评论 -
输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
注意递归出口:root为null或者左右节点访问完,返回返回时要注意把path的最后一个数据remove注意:不能把path直接add到res中。否则更改path的时候。res中的path也会随之而改变。这就是因为res中存的时path的引用,path发生改变时,res中的值会发生相应改变代码:import java.util.ArrayList;/**public ...原创 2020-03-20 23:31:11 · 373 阅读 · 0 评论 -
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
二叉搜索树的特点:遍历的时候,如果遇到比最后一个元素大的节点,就说明它的前面都比最后一个元素小,该元素后面的所有值都必须大于最后一个值,这两个条件必须都要满足。否则就说明该序列不是二叉树后序遍历。代码:public class Solution { public boolean VerifySquenceOfBST(int [] arr) { if(arr==nu...原创 2020-03-18 00:49:36 · 211 阅读 · 0 评论 -
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
考虑用队列来实现。队列的常用方法:容量不够或队列为空时不会抛异常:offer(添加队尾元素)、peek(访问队头元素)、poll(访问队头元素并移除) 容量不够或队列为空时抛异常:add、element(访问队列元素)、remove(访问队头元素并移除注意:在Java中Queue是和List、Map同等级别的接口,LinkedList中也实现了Queue接口,代码:imp...原创 2020-03-17 23:40:40 · 97 阅读 · 0 评论 -
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.
题目描述:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)代码:import java.util.*;public class...原创 2020-03-17 23:09:56 · 230 阅读 · 0 评论 -
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。
分析:使用两个栈实现,一个用来存数据,另一个用来存最小值import java.util.Stack;public class Solution { Stack<Integer> stack=new Stack<Integer>(); Stack<Integer> min=new Stack<Integer>();...原创 2020-03-17 21:19:35 · 280 阅读 · 0 评论 -
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,
步骤:用四个变量(up ,down,left,right)模拟数组的边界,1.输出最上的一行,再up++。再判断up是否>down,若是,则break。2输出最右的一行,再right--。再判断left是否>right,若是,则break。3.输出最下的一行,再down--;再判断up是否>down,若是,则break。4.输出最左的一行,再left++。再判断l...原创 2020-03-17 17:52:19 · 262 阅读 · 0 评论 -
操作给定的二叉树,将其变换为源二叉树的镜像。
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像分析:采用递归,将左右节点交换,递归出口:当节点为空时返回/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { ...原创 2020-03-17 17:02:31 · 163 阅读 · 0 评论 -
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
doesTree1HasTree2:该函数用来对比root1中是否包含root2当root1先为null,则表示root1不包含root2当root2先为null,则表示root2包含root1/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = nul...原创 2020-03-17 16:54:11 · 118 阅读 · 0 评论 -
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
方法一:直接比较法(笨办法)以list1为基础,list2的节点比list1的大,并且比list1的下一个节点小,则把该节点插入到list1,并且list1和list2都指向下一个节点若不符合该条件,则list1指向下一个节点注意:需要注意当list1节点到最后时要避免空指针/*public class ListNode { int val; ListNode ...原创 2020-03-17 15:46:36 · 83 阅读 · 0 评论 -
输入一个链表,输出该链表中倒数第k个结点
考虑使用快慢指针分析:要得到倒数第k个节点,步骤:1.让fast指针先走k步,2.让fast指针和low指针一起走,3.循环的出口:当fast指针刚好走完整个链表,即fast==null,此时low指针的指向刚好时倒数第k个节点/*public class ListNode { int val; ListNode next = null; Li...原创 2020-03-17 01:18:10 · 119 阅读 · 0 评论 -
单链表的反转
只需要四个指针,分别指向当前节点(B),前一个节点(A)和后一个节点(C)和head指针实际上只需要三个指针,C可以用A.next表示。步骤:1.将A的next指向C2.将B的next指向head3.更新head4.将C作为下一个要移动的节点,即把C 当作再B重复1,2,3过程5.当B为空时,跳出循环节点的定义:/** * 单个节点的定义 * @autho...原创 2020-03-17 00:59:27 · 91 阅读 · 0 评论 -
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
方法一:考虑用冒泡排序算法public class Solution { public void reOrderArray(int [] array) { for(int i=0;i<array.length;i++){ for(int j=0;j<array.length-i-1;j++){ if(...原创 2020-03-16 23:39:50 · 129 阅读 · 0 评论 -
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 保证base和exponent不同时为0
方法一:使用内置函数Math.pow(base,exponent)方法二:暴力递归解法public class Solution { public double Power(double base, int exponent) { if(exponent==0&&base!=0){ return 1D; }...原创 2020-03-16 17:13:52 · 240 阅读 · 0 评论 -
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
1.原码,反码和补码正整数的原码和反码及补码都是它本身负整数的原码是它本身。其反码是最高位不变,其余位取反。其补码是反码加1.如1的原码是0000 0001,反码和补码都是0000 0001。-1的原码是1000 0001,反码是1111 1110,补码是1111 1111。2.Integer.toBinaryString(int n):该函数表示将一个int转化成其对应的二进...原创 2020-03-16 00:13:08 · 104 阅读 · 0 评论 -
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
题目描述:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:分析:我们对算法模型做些简化,我们知道,只可以放置两种类型的小矩形,一种是竖着放的2*1矩形,另一种是两块横着放的2*1矩形上下放置形成的2*2正方形,而题目要放置的是2*n的大矩形。要放置的是2*n的...原创 2020-03-15 19:06:50 · 946 阅读 · 0 评论 -
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
此题与 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果) 有所区别,详看青蛙跳台阶分析:n个台阶设有f(n)种跳法要跳n个台阶,可以先跳1个台阶,剩下的n-1个台阶有f(n-1)种跳法 可以先跳2个台阶,剩下的n-2个台阶有f(2-1)种跳法 ...原创 2020-03-15 17:51:08 · 435 阅读 · 0 评论 -
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
分析:假定跳n个台阶右f(n)种跳法,容易知道一个台阶有一种跳法,两个台阶有两种跳法即f(1)=1,f(2)=2;现有n个台阶,考虑先跳一步,则剩下的n-1个台阶有f(n-1)种跳法 考虑先跳两步,则剩下的n-2个台阶有f(n-2)种跳法即有f(n)=f(n-1)+f(n-2),即为斐波那契数列代码:public cl...原创 2020-03-15 17:13:23 · 392 阅读 · 0 评论 -
斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。
题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39方法一:递归话不多说,直接上代码。只要注意下递归出口就行public class Solution { public int Fibonacci(int n) { if(n==1){ return 1; ...原创 2020-03-15 16:28:17 · 1274 阅读 · 0 评论 -
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。方法一:考虑用递归实现分析:array[mid]>array[left]时,最小数必定在mid的右...原创 2020-03-15 15:26:02 · 1094 阅读 · 0 评论 -
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
用两个栈来实现一个队列,完成队列的Push和Pop操作。栈为先进后出,队列为先进先出。分析:若经过两次压栈,即先进栈1,再把栈1中元素压入栈2,则栈2中元素的顺序则是要实现的队列的顺序。输入:{1,2,3}压入stack1:{3,2,1}压入stack2:{1,2,3}那么stack2中的顺序一定是所需要的队列的顺序,若队列需要push,那么就压入stack1,若...原创 2020-03-15 11:14:58 · 150 阅读 · 0 评论 -
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。有关树的问题,一般可以考虑使用递归。方法:1.先找到根节点2.通过中序遍历找到左子树和右子树3.通过递归将左子树和右子树使...原创 2020-03-15 10:25:18 · 304 阅读 · 0 评论 -
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
方法一:用栈实现/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayLi...原创 2020-03-15 02:53:51 · 152 阅读 · 0 评论 -
替换字符串的空格
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy方法一:直接使用replace函数,一行搞定public class Solution { public String replaceSpace(StringBuffer str) { return str.t...原创 2020-03-15 01:56:32 · 151 阅读 · 0 评论 -
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1.使用最暴力的方法,将数组通过两次for循环进行遍历,判断其是否有该数字public class Solution { public boolean Find(int targe...原创 2020-03-14 22:34:47 · 679 阅读 · 0 评论