剑指Offer学习
剑指Offer
想追求完美的梦
这个作者很懒,什么都没留下…
展开
-
剑指Offer学习-面试题57:和为s的数字
/** * 和为s的数字 * <p> * 设置两个指针,左指针指向数组的开头,右指针指向结尾,由于数组是递增的 * 相加如果大于s,则右指针向左移动, * 小于s,则左指针向右移动 * * @param arr * @return */ public int[] findNumberWithSum(int[] arr, int s) { if (null == arr || arr.原创 2020-06-11 21:47:34 · 191 阅读 · 0 评论 -
剑指Offer学习-面试题56:数组中数字出现的次数
/** * 数组中数字出现的次数 * <p> * 一个整型数组里除两个数字之外,其他数字都出现了两次,请找出这两个只出现一次的数字 * * @param arr * @return */ public int[] findNumsAppearOnce(int[] arr) { if (null == arr || 0 == arr.length) return null; int a.原创 2020-06-11 21:26:20 · 221 阅读 · 0 评论 -
剑指Offer学习-面试题55:二叉树的深度
/** * 二叉树的深度 * * @param root * @return */ public int treeDepth(TreeNode root) { if (null == root) return 0; int left = treeDepth(root.left); int right = treeDepth(root.right); return Math.max(le.原创 2020-06-11 20:39:39 · 251 阅读 · 0 评论 -
剑指Offer学习-面试题54:二叉搜索树的第k大节点
/** * 二叉搜索树的第k大节点 * * @param root * @return */ public TreeNode kthNode(TreeNode root, int k) { int count = 0; TreeNode cur = root; while (cur != null) { TreeNode mostRight = cur.left; .原创 2020-06-10 22:11:25 · 170 阅读 · 0 评论 -
剑指Offer学习-面试题53:在排序数组中查找数字
/** * 在排序数组中查找数字 * 统计一个数字在排序数组中出现的次数 * * @param arr * @return */ public int getNumberOfK(int[] arr, int k) { if (null == arr || 0 == arr.length) return 0; int first = getFirstIndex(arr, k); int las.原创 2020-06-10 21:47:57 · 131 阅读 · 0 评论 -
剑指Offer学习-面试题52:两个链表的第一个公共节点
/** * 两个链表的第一个公共节点 * <p> * 先计算两个链表的长度,让长的链表先走两个链表的差值,然后一起走,比较相等 * * @param l1 * @param l2 * @return */ public ListNode findFirstCommonNode(ListNode l1, ListNode l2) { if (null == l1 || null == l2) .原创 2020-06-10 21:23:24 · 166 阅读 · 0 评论 -
剑指Offer学习-面试题51:数组中的逆序对
int res = 0; /** * 数组中的逆序对 * <p> * 归并排序求逆序对 * * @param arr * @return */ public int inversePairs(int[] arr) { if (null == arr || 0 == arr.length) return 0; mergeSort(arr, 0, arr.length - 1).原创 2020-06-10 21:12:35 · 155 阅读 · 0 评论 -
剑指Offer学习-面试题50:第一次只出现一次的字符
/** * 第一次只出现一次的字符 * * @param str * @return */ public char firstNotRepeating(String str) { if (null == str || 0 == str.length()) return ' '; int[] p = new int[26]; Arrays.fill(p, -1); for (int i .原创 2020-06-09 21:32:55 · 131 阅读 · 0 评论 -
剑指Offer学习-面试题49:丑数
/** * 丑数 * 我们把只包含因子2,3,5的数称作丑数,从小到大顺序求第number个丑数 * <p> * 三指针 * * @param number * @return */ public int getUglyNumber(int number) { if (number < 0) return 0; int a = 1; int b = 1;.原创 2020-06-09 21:18:43 · 101 阅读 · 0 评论 -
剑指Offer学习-面试题48:最长不含重复字符的子字符串
/** * 最长不含重复字符的子字符串 * * @param str * @return */ public int longestSubstringWithoutDuplication(String str) { if (null == str || 0 == str.length()) return 0; //记录字母最后一次出现的下标 int[] position = new int[26];.原创 2020-06-09 20:59:41 · 187 阅读 · 0 评论 -
剑指Offer学习-面试题47:礼物的最大价值
/** * 礼物的最大价值 * <p> * f(i,j)=max(f(i-1,j),f(i,j-1))+arr[i][j] * * @param arr * @return */ public static int getMaxValue_solution(int[][] arr) { if (null == arr || 0 == arr.length) return 0; int .原创 2020-06-09 20:37:19 · 127 阅读 · 0 评论 -
剑指Offer学习-面试题46:把数字翻译成字符串
/** * 把数字翻译成字符串,计算有多少种翻译方法 * * @param n * @return */ public int getTranslationCount(int n) { if (n < 10) return 1; char[] arr = String.valueOf(n).toCharArray(); int[] dp = new int[arr.length]; .原创 2020-06-09 20:19:14 · 137 阅读 · 0 评论 -
剑指Offer学习-面试题45:把数组排成最小的数
/** * 把数组排成最小的数 * * @param arr * @return */ public String printMinNumber(String[] arr) { if (null == arr || 0 == arr.length) return ""; Arrays.sort(arr, (a, b) -> (a + b).compareTo(b + a)); return St.原创 2020-06-08 20:50:59 · 112 阅读 · 0 评论 -
剑指Offer学习-面试题44:数字序列中某一位的数字
/** * 数字序列中某一位的数字 * * @param index * @return */ public int digitAtIndex(int index) { if (index < 0) return -1; int digits = 1; while (true) { int numbers = countOfIntegers(digits); .原创 2020-06-08 20:33:17 · 140 阅读 · 0 评论 -
剑指Offer学习-面试题42:连续子数组的最大和
/** * 连续子数组的最大和 * * @param arr * @return */ public int findGreatestSumOfSubArray(int[] arr) { if (null == arr || 0 == arr.length) return 0; int max = Integer.MIN_VALUE; int cur = 0; for (int i :.原创 2020-06-05 21:45:17 · 153 阅读 · 0 评论 -
剑指Offer学习-面试题41:数据流中的中位数
public static void main(String[] args) { while (true) { Scanner input = new Scanner(System.in); System.out.println("请输入一个正整数:"); int cur = input.nextInt(); System.out.println("此时的中位数是:" + getMid(cur).原创 2020-06-05 21:40:59 · 139 阅读 · 0 评论 -
剑指Offer学习-面试题40:最小的k个数
/** * 最小的k个数 * <p> * 利用堆 * * @param arr * @param k * @return */ public int[] getLeastNumber(int[] arr, int k) { if (null == arr || 0 == arr.length || k >= arr.length) return arr; Priorit.原创 2020-06-05 20:56:05 · 124 阅读 · 0 评论 -
剑指Offer学习-面试题39:数组中超过一半的数字
/** * 数组中超过一半的数字 * <p> * 遇到相等的数count加1,不相等就减1,如果存在一个数在数组中占一半,则遍历完当前值必定是这个数 * * @param arr * @return */ public int moreThanHaIfNum(int[] arr) { if (null == arr || 0 == arr.length) return -1; int .原创 2020-06-05 20:13:37 · 139 阅读 · 0 评论 -
剑指Offer学习-面试题38:字符串的排列
/** * 字符串的排列 * * @param s */ public void permutation(String s) { char[] arr = s.toCharArray(); process(arr, 0); } /** * 每次让首字母和后面的交换 * * @param arr * @param index */ private voi.原创 2020-06-04 22:25:15 · 169 阅读 · 0 评论 -
剑指Offer学习-面试题37:序列化与反序列化二叉树
/** * 反序列化二叉树 * * @param s */ public TreeNode deSerialize(String s) { if (s.charAt(index) != '$') { TreeNode root = new TreeNode(s.charAt(index)); index++; root.left = deSerialize(s); .原创 2020-06-04 21:59:01 · 200 阅读 · 0 评论 -
剑指Offer学习-面试题36:二叉搜索树与双向链表
/** * 二叉搜索树与双向链表 * * @param root * @return */ public BinaryTreeNode convert(BinaryTreeNode root) { BinaryTreeNode last = null; convertNode(root, last); BinaryTreeNode head = last; while (head !..原创 2020-06-04 21:36:23 · 129 阅读 · 0 评论 -
剑指Offer学习-面试题35:复杂链表的复制
/** * 复杂链表的复制 * * @param root * @return */ public ComplexListNode clone(ComplexListNode root) { //复制节点并拼接到后面 cloneNodes(root); //复制sibling节点 connectSibNode(root); //断开节点 ComplexL.原创 2020-06-04 21:16:59 · 150 阅读 · 0 评论 -
剑指Offer学习-面试题34:二叉树中和为某一值的路径
List<Integer> list = new ArrayList<>(); /** * 二叉树中和为某一值的路径 * <p> * 前序遍历二叉树,list保存节点,遇到没有孩子节点并且等于k,则打印 * * @param root * @param k */ public void findPath(TreeNode root, int k) { if (null.原创 2020-05-30 18:00:49 · 193 阅读 · 0 评论 -
剑指Offer学习-面试题33:二叉搜索树的后序遍历序列
/** * 二叉搜索树的后序遍历序列 * * @return */ public boolean verifySquenceOfBST(int[] arr) { if (null == arr || arr.length < 2) return true; return is(0, arr.length - 1, arr); } private static boolean is(int left, i.原创 2020-05-29 22:24:09 · 267 阅读 · 1 评论 -
剑指Offer学习-面试题32:从上到下打印二叉树(二叉树的层次遍历)
/** * 从上到下打印二叉树(二叉树的层次遍历) * * @param root */ public void printFromTopToBottom(TreeNode root) { if (null == root) return; Queue<TreeNode> queue = new LinkedBlockingQueue<>(); queue.add(root); .原创 2020-05-29 21:46:04 · 177 阅读 · 0 评论 -
剑指Offer学习-面试题31:栈的压入,弹出序列
/** * 栈的压入,弹出序列 * 设置一个辅助栈,依次把弹出序列压入辅助栈,如果辅助栈顶元素和原始栈栈顶元素相等,则都弹出 * 最后栈为空就说明弹出序列是栈的压入序列 * * @param pushOrder * @param popOrder * @return */ public boolean isPopOrder(int[] pushOrder, int[] popOrder) { if (n.原创 2020-05-29 21:39:49 · 129 阅读 · 0 评论 -
剑指Offer学习-面试题30:包含min函数的栈
/** * 包含min函数的栈 */ class MinStack { Stack<Integer> data_stack = null; Stack<Integer> min_stack = null; public MinStack() { data_stack = new Stack<>(); min_stack = new Stack&..原创 2020-05-29 21:17:58 · 130 阅读 · 0 评论 -
剑指Offer学习-面试题29:顺时针打印矩阵
/** * 顺时针打印矩阵 * * @param arr */ public void printMatrixClockwisely(int[][] arr) { if (null == arr || 0 == arr.length) return; int x = arr.length; int y = arr[0].length; int start = 0; while .原创 2020-05-28 22:51:40 · 120 阅读 · 0 评论 -
剑指Offer学习-面试题28:对称的二叉树
/** * 对称的二叉树 * <p> * 只需要判断左子树是否和右子树相等就行 * * @param root * @return */ public boolean isSymmetrical(TreeNode root) { return isSymmetrical(root, root); } /** * 判断左子树是否和右子树相等 * * @pa.原创 2020-05-28 22:04:29 · 117 阅读 · 0 评论 -
剑指Offer学习-面试题27:二叉树的镜像
/** * 二叉树的镜像 * <p> * 如果一个节点左右节点都不为空,则交换左右节点 * * @param root */ public static void mirrorRecursively(TreeNode root) { if (null == root) return; TreeNode left = root.left; TreeNode right = root.原创 2020-05-28 21:53:47 · 139 阅读 · 0 评论 -
剑指Offer学习-面试题26:树的子结构
/** * 树的子结构 * * @param a * @param b * @return */ public boolean hasSubtree(TreeNode a, TreeNode b) { boolean res = false; if (a != null && b != null) { if (Objects.equals(a.val, b.val)).原创 2020-05-28 21:38:43 · 105 阅读 · 0 评论 -
剑指Offer学习-面试题25:合并两个排序的链表
/** * 合并两个排序的链表 * 这里我选择让所有的节点往a链表合并 * 设置一个前驱节点,当a小于cur时,cur直接下一个 * 当a不小于cur时,先记录b的下一个节点next,然后把pre的下一个节点指向b,然后把pre的下一个下一个节点指向cur,最后把next赋值给b * * @param a * @param b * @return */ public static ListNode merge.原创 2020-05-28 21:16:05 · 137 阅读 · 0 评论 -
剑指Offer学习-面试题24:反转链表
/** * 反转链表 * * @param head * @return */ public ListNode reverseListNode(ListNode head) { if (null == head) { return null; } ListNode res = null; ListNode cur = head; while (c.原创 2020-05-27 22:45:09 · 127 阅读 · 0 评论 -
剑指Offer学习-面试题23:链表中环的入口节点
/** * 链表中环的入口节点 * 1->2->3->4->5->6->3 * 设置快慢两个指针,从头节点开始出发,快指针每次走两步,慢指针每次走一步,直到相遇或者快指针到空节点退出。 * 然后设置快指针为头节点,和慢指针每次走一步,相遇即环的入口 * * @param head * @return */ public ListNode meetingNode(ListNode he.原创 2020-05-27 22:30:03 · 173 阅读 · 0 评论 -
剑指Offer学习-面试题22:链表中倒数第K个节点
/** * 链表中倒数第K个节点 * <p> * 遍历二次的方法:先遍历一次计算链表的长度len,在遍历一次找到len-k * 遍历一次的方法:设置快慢两个指针,让快指针先走k步,然后慢指针从头开始,同时向前走,最后快指针为空时,慢指针就是目标节点 * * @param head * @param k * @return */ public ListNode findKthToTail(List..原创 2020-05-27 21:57:42 · 162 阅读 · 0 评论 -
剑指Offer学习-面试题21:调整数值顺序使奇数位于偶数前面
/** * 调整数值顺序使奇数位于偶数前面 * * @param arr */ public void reorderOddEven(int[] arr) { if (null == arr || arr.length < 2) { return; } int left = 0; int right = arr.length; while (lef.原创 2020-05-27 21:38:42 · 143 阅读 · 0 评论 -
剑指Offer学习-面试题20:表示数值的字符串
/** * 表示数值的字符串 * <p> * 表示数值的字符串遵循A[.[B]][e|EC]或者.B[e|EC] * A为数值的整数部分 * B为数值的小数部分 * C为数值的指数部分 * <p> * 在小数里面可能没有整数部分 如.123 * * @param s * @return */ public boolean isNumeric(String .原创 2020-05-27 21:20:49 · 220 阅读 · 0 评论 -
剑指Offer学习-面试题19:正则表达式匹配
/** * 正则表达式匹配 * <p> * .表示任意一个字符 * *表示它前面的字符可以出现任意次 * * @param s * @param pattern * @return */ public boolean match(String s, String pattern) { if (null == s || null == pattern) { r.原创 2020-05-27 20:31:54 · 246 阅读 · 0 评论 -
剑指Offer学习-面试题18:删除链表的节点
/** * 删除链表的节点 * 给定单项链表的头指针和一个节点指针,定义一个函数在O(1)的时间内删除该节点 * * @param node * @return */ public ListNode deleteNode(ListNode head, ListNode node) { if (null == head || null == node) { return null; ..原创 2020-05-26 22:28:20 · 170 阅读 · 0 评论 -
剑指Offer学习-面试题17:打印从1到最大的n位数
/** * 打印从1到最大的n位数 * * @param n */ public void print1ToMaxOfNDigits(int n) { char[] number = new char[n]; for (int i = 0; i < number.length; i++) { number[i] = '0'; } for (int i = n - 1.原创 2020-05-26 22:06:53 · 164 阅读 · 0 评论