- 博客(33)
- 收藏
- 关注
原创 37:从上到下打印二叉树
从上到下打印二叉树 二叉树的层次遍历的变种,使用两个变量记录待打印的数据个数和下次待打印的数据个数即可。 public class Offer37 { public static void cengci2(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root);
2020-07-31 22:14:47 110
原创 36:从上到下打印二叉树
从上到下打印二叉树 这个题目也就是二叉树的层次遍历,使用队列来做 public class Offer37 { public static void cengci(TreeNode root){ if(root==null)return; LinkedList<TreeNode> queue = new LinkedList<>(); queue.add(root); while (!queue.isEmpty()){
2020-07-31 21:55:19 71
原创 35:包含min函数的栈
包含min函数的栈 定义栈的结构,请在该类型中实现一个能够得到栈的最小元素的min函数。 在该栈中,调用min,push及pop的时间复杂度都是O(1) 主要问题点: 再把最小值弹出之后,我们如何知道下一个最小值,所以才需要用到额外的辅助栈。 public class Offer36 { Stack<Integer> stack1 = new Stack<>(); Stack<Integer> stack2 = new Stack<>();
2020-07-30 21:10:12 80
原创 34:顺时针打印矩阵
顺时针打印矩阵 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。 public class Offer35 { public static void main(String[] args) { int[][] data = {{1,2,3,4}, {1,2,3,4}, {1,2,3,4}}; printMatrixInCircle(data); }
2020-07-29 23:38:25 107
原创 33:对称的二叉树
对称的二叉树 请实现一个函数,用来判断一颗二叉树是不是堆成。 public class Offer34 { //思路:递归来做,一次同时比较左右两个对称的点位 public static boolean isSymmetrical(TreeNode root1,TreeNode root2){ if(root1==null && root2==null)return true; if(root1==null||root2==null)retu
2020-07-28 22:41:24 60
原创 32:二叉树的镜像
二叉树的镜像 完成一个函数,输入一颗二叉树,输出它的镜像 public class Offer33 { public static void main(String[] args) { TreeNode node = Offer10.createNode(); mirrorRecursively(node); Main.cengci(node); } //思路:将某节点下的两个节点互换即可 public static void
2020-07-27 22:22:59 70
原创 31:树的子结构
树的子结构 输入两个二叉树A和B,判断B是不是A的子结构 public class Offer32 { //思路:1.在A树中找到与B树根相同的节点。2.比较后续的树结构是否相同 public static boolean hasSubTree2(TreeNode tree1,TreeNode tree2){ boolean result = false; if(tree2==null||tree1==null)return false; //
2020-07-26 21:54:16 63
原创 30:合并两个排序的链表
合并两个排序的链表 输入两个递增排序的链表,合并这两个链表并使新链表找那个的节点依然是递增排序的 public class Offer31 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(3); LNode node3 = new LNode(5); LNode node4 = new LNode(7);
2020-07-25 23:39:19 68
原创 29:反转链表
反转链表 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头节点 public class Offer30 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(2); LNode node3 = new LNode(3); LNode node4 = new LNode(4);
2020-07-24 22:19:27 67
原创 28:链表中环的入口节点
链表中环的入口节点 如果一个链表中包含环,如何找出环的入口节点? public class Offer29 { public static void main(String[] args) { LNode node1 = new LNode(1); LNode node2 = new LNode(2); LNode node3 = new LNode(3); LNode node4 = new LNode(4); LNode nod
2020-07-23 22:42:33 87
原创 27:链表中倒数第K个节点
链表中倒数第K个节点 输入一个链表,输出该链表中倒数第K个节点 public class Offer28 { //思路,定义两个节点变量first,next,first先指向头节点,走k-1步,这时候next节点指向头结点,first节点走到尾节点 //链表不能为空,k>0,k<=链表的长度 public static LNode FindKthToTail(LNode node, int k){ if(node==null||k==0)return nu
2020-07-22 22:53:28 69
原创 26:调整数组顺序使奇数位于偶数前面
调整数组顺序使奇数位于偶数前面 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分 public class Offer27 { public static void main(String[] args) { int[] arr = {1,4,2,8,3,5}; ReorderOddEvent(arr); for (int i : arr) { System.out.
2020-07-21 21:44:09 68
原创 25:表示数值的字符串
表示数值的字符串 设计一个函数用来判断字符串是否表示数值(包括整数和小数) 字符串+100,5e2,-123,3.1415926,-1E-16都表示数值,但12e,1a3.14,1.2.3,±5,12e+5.4 public class Offer26 { public static void main(String[] args) { String s = new String("12e+6.4"); System.out.println(isNumeric(s.toCh
2020-07-20 21:13:33 120
原创 24:正则表达式
正则表达式 请设计一个函数用来匹配包含’.‘和’‘的正则表达式,’.‘表示匹配任意字符,’'表示它前面的字符可以任意次数。例如字符串"aaa"与模式a.a和abaca匹配,不与aa.a和ab*a匹配 public class Offer25 { public static void main(String[] args) { char[] str = new String("fsffffas").toCharArray(); char[] p1 = new Stri
2020-07-19 22:26:18 233
原创 23:删除链表的重复节点
删除链表中重复的节点 条件:链表为排序链表 public class Offer24 { public static void findDuplicateNodes(LNode node) { if(node==null)return; //定义引用指向next节点 LNode pre = node; LNode next = node.next; //1.如果为单节点,则不会进入循环 while (
2020-07-18 23:05:15 66
原创 22: 删除链表的节点
删除链表的节点 给定一个单向链表的头指针和节点指针,在O(1)时间内删除该节点 public class Offer23 { public static void deleteListNode(LNode head,LNode target){ //1.判断是否为空节点 if(head==null||target==null)return; //2.判断头结点是否指向目标指针,头节点情况 if(head==target){
2020-07-17 23:45:00 128
原创 21:打印从1到最大的n位数
打印从1到最大的n位数 例如n=3,从1打印到999 public class Offer22 { public static void main(String[] args) { printMaxOfN(2); } public static void printMaxOfN(int n){ if(n<1)return; //1.考虑大数的情况,所以使用char[] char[] number = new char[n+
2020-07-17 23:17:09 77
原创 20:数值的整次方
数值的整次方 实现函数double(double base,int exponent),求base的exponent次方 要点: 使用exponent>>1来代替exponent/2 使用exponent&1来判断奇偶 参数合规性判断 public class Offer21 { public static double power(double base,int exponent){ double result = 0; if(expone
2020-07-16 00:19:31 86
原创 19:二进制中1的个数
二进制中1的个数: 输入整数,输出该整数转二进制中1的值 public class Offer20 { /** * 这里需要想明白,一个整数减去1会发生什么 * 现在我们假想二进制序列中,第一个1位于最右边,当它减去1后,最右边的1会变成0 * 例子:0011减去1后得到0010 * 如果第一个位于第n个位置,当它减去1后,该位置会从1变为0,并在下一个位置由0变成1 * 例子:1100减去1后会得到1010 * i&(i-1)可
2020-07-14 23:19:22 121
原创 18:剪绳子
剪绳子: 一根长度为n的绳子,把绳子剪成m段,n>m>1且n>1,每段绳子的长度即为k[0],k[1]…k[m],求k[0]*k[1]…*k[m]的最大乘积. n是一个给定的绳子长度,m为未知 动态规划: public class Offer19 { public static void main(String[] args) { System.out.println(maxProduct(7)); } /** * 设置f(n)为绳子长度为n时的
2020-07-12 23:35:56 83
原创 Java集合:ArrayList
直接上正菜,先看接口 public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable{ } 接口的解释通常都会出现在接口源码的解释说明的第一行。 AbstractList抽象类: 抽象方法+已实现方法,看看就好 List: 方法接口 RandomAccess: List 实现该标记接口表示
2020-07-11 17:10:32 93
原创 17:机器人的运动范围
机器人的运动范围 存在m行n列的矩阵,一个机器人从(0,0)开始,可以向上、下、左、右走,但是不能进行行坐标和列坐标的数位之和大于k的格子,例如(23,43)的数位之和为 2+3+4+3=12,求机器人能到达多少格子? public class Offer18 { public static void main(String[] args) { System.out.println(movingCount(4,4,4)); } public static int m
2020-07-11 13:16:43 117
原创 16:矩阵中的路径
矩阵中的路径 设计一个函数,用来判断矩阵中是否存在一条包含字符串的路径 public class Offer17 { public static void main(String[] args) { char[][] data= { {'a','s','d'}, {'z','x','c'}, {'q','w','e'}, }; char[] temp = new String("sxw")
2020-07-11 00:03:28 66
原创 Java集合:Iterable接口
直入主题:先看下相关接口及JDK给出的解释 Iterable接口: //实现此接口允许对象成为“ for-each循环”语句的目标 public interface Iterable<T> { //return an Iterator. Iterator<T> iterator(); //给每个元素执行给定的操作,直到处理完所有元素或该操作引发异常为止。除非额外实现该方法 default void forEach(Consumer<? s
2020-07-09 23:41:12 135
原创 15:旋转数组的最小数字
题目:旋转数组的最小数字 一个递增排序数组{1,2,3,4,5},将数组起始往后的若干数据挪到数组的结尾,例如:{3,4,5,1,2,},那生成的数组为原数组的旋转数组之一 思路:用二分查找 特例:{0,1,1,1,1}生成的数组{1,0,1,1,1,}和{1,1,1,0,1}这种情况只能使用遍历数组的方式 public class Offer16 { public static void main(String[] args) { int[] arr = {1, 0,1 , 1, 1}
2020-07-09 21:32:27 59
原创 14:青蛙台阶问题
青蛙台阶问题: 青蛙一次能走1个或2个台阶,n个台阶有几种走法? public class Offer14 { public static void main(String[] args) { System.out.println(frogDo(8)); System.out.println(frogDo2(8)); } /** * 当只有一阶台阶,只有一种走法;当有两阶台阶,有两种走法; * 当台阶数n>2时,走法数关于台阶的函数为f(
2020-07-08 12:16:22 76
原创 13:求斐波那契数列的第n项
求斐波那契数列的第n项 public class Offer13 { /** * 递归方式:n过大,会发生栈溢出 */ public static int fibonacci1(int n){ if(n==0)return 0; if(n==1)return 1; return fibonacci1(n-1)+fibonacci1(n-2); } /** * 循环方式 */ public stati
2020-07-07 21:50:23 781
原创 12:使用两个栈实现队列
使用两个栈实现队列 队列内存在appendTail(),deleteHead(),栈一和栈二,实现appendTail()-队列尾部插入节点和deleteHead()-队列头删除节点功能 栈:先进后出 队列:先进先出 public class Offer12 {} class Queue{ /** * 情况一:如果stack2为空,则直接压栈到stack1 * 情况二:如果stack2不为空,需要把stack2内的元素压倒stack1,再把新数据压倒stack1
2020-07-06 22:49:48 92
原创 11:二叉树的下个节点
二叉树的下一个节点 给定一颗二叉树和其中一个节点,如何找出中序遍历序列的下一个节点? 树节点有三个指针,左子树,右子树,父节点 中序遍历顺序:左-根-右 public class Offer11 { public static TreeNode2 getNextNode(TreeNode2 node){ //如果节点存在右子树,那么他的下个节点为下个右子树的最左节点 if(node.right!=null){ node = node.right;
2020-07-05 16:12:29 86
原创 10:重建二叉树
题目:重建二叉树 输入二叉树的前序遍历和中序遍历重构二叉树,树表示方式为链表 前序遍历:1 2 4 5 3 6 7 ,根-左-右 ,根节点:7,左子树:2 4 5,右子树:3 6 7 中序遍历:4 2 5 1 6 3 7 ,左-根-右 ,根节点:7,左子树:4 2 5,右子树:6 3 7 public class Offer10 { public static void main(String[] args) { int[] preorder = {1,2,4,5,3,6,7};
2020-07-05 15:24:58 102
原创 09:逆序打印一个链表
逆序打印一个链表 用一个栈结构或者一个数组可以,只要保证“先进后出”的准则即可 public class Offer09 { public static void main(String[] args) { Node node1 = new Node(1); Node node2 = new Node(2); Node node3 = new Node(3); Node node4 = new Node(4); Node node5
2020-07-03 23:16:04 107
原创 08:字符串替换空格
题目:替换空格 实现一个函数,存在字符串hello world!!!,将字符串内的空格字符替换为’%20’。 先对空格个数进行计数,得到适当大小的字符数组,接着将原本数组从后向前替换到新数组中。 public class Offer08 { public static void main(String[] args) { String string = "hello world! !"; System.out.println(replaceBlank(string))
2020-07-02 22:23:05 173
原创 07:从一个二维数组中查找一个数
题目:从一个二维数组中查找一个数 数组要求:从左到右,从上到小依次递增的矩形二维数组 思路:我们从矩阵的右上角开始查找,若该位置的数值小于目标值,列数减一;若数值大于目标值,行数加一,后续重复。 public class Offer07 { public static void main(String[] args) { int[][] arr = { {1, 2, 8, 9}, {2, 4, 9, 12},
2020-07-01 23:37:44 226
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人