剑指offer
云养猫v2
这个作者很懒,什么都没留下…
展开
-
191. 位1的个数 剑指 Offer 15 二进制中1的个数
public int hammingWeight(int n) { int bits = 0; int mask = 1; for (int i = 0; i < 32; i++) { if ((n & mask) != 0) { bits++; } mask <<= 1; } return b原创 2021-01-14 10:48:32 · 102 阅读 · 0 评论 -
Longest Repeating Substring + 最长重复子串 + 后缀数组
public class LongestRepeatedSubstring { // Do not instantiate. private LongestRepeatedSubstring() { } /** * Returns the longest common string of the two specified strings. * * @param s one string * @param t the other str原创 2020-10-01 09:40:48 · 158 阅读 · 0 评论 -
在数组中找到一个局部最小的位置
定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0]<arr[1],那么arr[0]是局部最小;如果arr[N-1]<arr[N-2],那么arr[N-1]是局部最小;如果0<i<N-1,既有arr[i]<arr[i-1],又有arr[i]<arr[i+1],那么arr[i]是局部最小。给定无序数组arr,已知arr中任意两个相邻的数不相等。写一个函数,只需返回arr中任意一个局部最小出现的位置即可[要求]原创 2020-08-31 17:01:28 · 196 阅读 · 0 评论 -
火水风四种元素平衡 ABCD四个相等
《XX魔法书》中记载,只有魔法师体内地火水风四种元素平衡的时候才是绝对安全的。某魔法师在给自己做了一个体检,发现自己体内的四种元素数量分别是A,B,C,D,魔法师慌了,这时他看到魔法书中记载了一种转换魔法,可以把任意两个单位的元素转换成任意一种元素。 请问魔法师是否可以通过这种魔法,在保证自己体内的元素总量尽可能多的情况下, 使得自己体内的四种元素数量完全相同?如果可以,请输出平衡后体内元素总量,如果不能请输出-1。 输入描述 输入仅包含一行,仅包含4个正整数A,B原创 2020-08-19 23:06:11 · 3651 阅读 · 10 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字 约瑟夫环
public int lastRemaining(int n, int m) { ArrayList<Integer> list = new ArrayList<>(n); for (int i = 0; i < n; i++) { list.add(i); } int idx = 0;// while (n > 1) {// idx = (i原创 2020-08-08 21:18:27 · 96 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n 要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
public int sumNums(int n) { boolean flag = n > 1 && (n += sumNums(n-1)) > 0; return n; }原创 2020-08-08 20:34:57 · 104 阅读 · 0 评论 -
剑指 Offer 65. 不用加减乘除做加法
https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/solution/mian-shi-ti-65-bu-yong-jia-jian-cheng-chu-zuo-ji-7/public int add(int a, int b) { while (b != 0) { int c = (a & b) << 1; a = a ^原创 2020-08-08 19:58:53 · 78 阅读 · 0 评论 -
剑指 Offer 59 - II. 队列的最大值
class MaxQueue { private Queue<Integer> queue1; private Deque<Integer> deque; public MaxQueue() { queue1 = new ArrayDeque<>(); deque = new ArrayDeque<>(); } public in原创 2020-08-08 16:52:31 · 104 阅读 · 0 评论 -
剑指 Offer 59 - I. 滑动窗口的最大值
public int[] maxSlidingWindow(int[] nums, int k) { if (nums.length == 0) return new int[0]; int n = nums.length; int[] res = new int[n-k+1]; Deque<Integer> deque = new ArrayDeque<>(); // deque里从前到后是 从大到小的原创 2020-08-08 16:09:57 · 67 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
public String reverseWords(String s) { if (s.length() == 0) return s; int n = s.length(); int lo = 0, hi = s.length()-1; while (lo <= hi) { if (s.charAt(lo) == ' ') lo++; else if (s.charAt(h原创 2020-08-08 15:17:26 · 73 阅读 · 0 评论 -
剑指 Offer 57 - II. 和为s的连续正数序列
public int[][] findContinuousSequence(int target) { if (target < 3) return new int[0][]; List<int[]> res = new ArrayList<>(); for (int lo = 1, hi = 2, sum = 3; hi <= target/2 + 1;) { if (sum < targ原创 2020-08-08 15:02:43 · 118 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
public int translateNum(int num) { String s = String.valueOf(num); int n = s.length(); int[] dp = new int[n+1]; dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { int num1 = Integer.valueO.原创 2020-08-08 09:36:51 · 89 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
递归 Node prev, head; public Node treeToDoublyList(Node root) { if (root == null) return null; prev = null; head = null; inOrder(root); head.left = prev; prev.right = head; return head;原创 2020-08-07 20:16:03 · 58 阅读 · 0 评论 -
剑指 Offer 35. 复杂链表的复制
public Node copyRandomList(Node head) { if (head == null) return head; Node p = head; while (p != null) { Node newNode = new Node(p.val); newNode.next = p.next; p.next = newNode;原创 2020-08-07 19:55:51 · 69 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
public boolean verifyPostorder(int[] postorder) { return verifyPostorderSub(postorder, 0, postorder.length-1); } private boolean verifyPostorderSub(int[] postorder, int lo, int hi) { if (lo >= hi) return true; int root原创 2020-08-07 19:34:16 · 73 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
public boolean isSubStructure(TreeNode A, TreeNode B) { if (B == null) return false; if (A == null) return false; if (isSame(A, B)) return true; return isSubStructure(A.left, B) || isSubStructure(A.right, B原创 2020-08-07 16:40:11 · 68 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
public int[] exchange(int[] nums) { int lo = 0, hi = nums.length-1; while (lo < hi) { while (lo < hi && (nums[lo] & 1) == 1) lo++; while (lo < hi && (nums[hi] & 1) == 0) hi.原创 2020-08-07 16:28:36 · 83 阅读 · 0 评论 -
343. 整数拆分 剑指 Offer 14- II. 剪绳子 II
public int integerBreak(int n) { if(n <= 3) return n-1; long res = 1L; //贪心算法,优先切三,其次切二 while (n > 4) { res *= 3; //res = res % 1000000007; n -= 3; } //出来循环只有三种情况,分别原创 2020-08-07 15:23:45 · 108 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
public int[] reversePrint(ListNode head) { int cnt = 0; ListNode curr = head; while (curr != null) { curr = curr.next; cnt++; } int[] res = new int[cnt]; reverseSub(head, re原创 2020-08-07 13:52:29 · 78 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
public int findRepeatNumber(int[] nums) { Set<Integer> set = new HashSet<>(); for (int x : nums){ if (!set.add(x)) { return x; } } return -1; }原创 2020-08-05 19:33:23 · 100 阅读 · 0 评论 -
数据流中的中位数
private PriorityQueue<Integer> minHeap = new PriorityQueue<>(); private PriorityQueue<Integer> maxHeap = new PriorityQueue<>((i1, i2)->(i2-i1)); private int count = 0; public void insert(Integer num) { if ((c原创 2020-08-03 19:20:00 · 132 阅读 · 0 评论 -
矩阵中的路径
public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { if (matrix == null || matrix.length == 0) return false; for (int i = 0; i < rows; i++) { fo...原创 2020-04-10 12:45:17 · 64 阅读 · 0 评论 -
字符串的排列
public ArrayList<String> Permutation(String str) { ArrayList<String> res = new ArrayList<>(); if (str == null || str.length() == 0) return res; char[] char...原创 2020-03-02 13:38:25 · 70 阅读 · 0 评论 -
复杂链表的复制
public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) return null; Map<RandomListNode, RandomListNode> map = new HashMap<>(); ...原创 2020-03-02 10:22:54 · 91 阅读 · 0 评论 -
顺时针打印矩阵
public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> res = new ArrayList<>(); if (matrix == null || matrix.length == 0 || matrix[0].length == 0) retur...原创 2020-03-01 20:15:22 · 87 阅读 · 0 评论 -
构建乘积数组
暴力解法public int[] multiply(int[] A) { if (A == null) return null; int len = A.length; int[] B = new int[len]; if (len == 0) return B; for (int i = 0; i < len; i++) { int tmp = 1; for (in...原创 2020-02-29 16:57:36 · 71 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数) 约瑟夫环
public class Solution { public int LastRemaining_Solution(int n, int m) { if (n <= 0) return -1; List<Integer> list = new LinkedList<>(); for (int i = 0; i < n; i++) list...原创 2020-02-29 16:31:10 · 129 阅读 · 0 评论 -
左旋转字符串
public String LeftRotateString(String str,int n) { if (str == null || n < 0) return null; if (n > str.length()) return ""; char[] strs = str.toCharArray(); int l...原创 2020-02-29 15:46:20 · 73 阅读 · 0 评论 -
和为S的两个数字
暴力解法public ArrayList<Integer> FindNumbersWithSum(int[] array,int sum) { ArrayList<Integer> res = new ArrayList<>(); if (array == null || array.length == 0) { ...原创 2020-02-29 14:54:52 · 72 阅读 · 0 评论 -
丑数
public int GetUglyNumber_Solution(int n) { if (n == 0) return 0; if (n == 1) return 1; int[] dp = new int[n+1]; // dp[i] holds the ith's ugly number dp[1] = 1; ...原创 2020-02-28 14:41:02 · 73 阅读 · 0 评论 -
数组中出现次数超过一半的数字
// 利用hashmappublic int MoreThanHalfNum_Solution(int [] array) { if (array == null || array.length == 0) return 0; int len = array.length; int res = 0; Map<Integer...原创 2020-02-28 10:32:47 · 74 阅读 · 0 评论 -
连续子数组的最大和 53. Maximum Subarray
public int FindGreatestSumOfSubArray(int[] array) { if (array == null || array.length == 0) return 0; int[] dup = new int[array.length]; dup[0] = array[0]; int max = d...原创 2020-02-27 19:36:06 · 90 阅读 · 0 评论 -
数字在排序数组中出现的次数
public int GetNumberOfK(int[] array , int k) { if (array == null || array.length == 0) return 0; int lo = 0, hi = array.length-1; int index = -1; int times = 0; while (lo <= hi) { int mid ...原创 2020-02-27 18:00:30 · 92 阅读 · 0 评论 -
变态跳台阶
链接:https://www.nowcoder.com/questionTerminal/22243d016f6b47f2a6928b4313c85387?f=discussion来源:牛客网1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。2)n = 1时,只有1种跳法,f(1) = 1n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2...原创 2020-02-27 15:58:21 · 96 阅读 · 0 评论 -
序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 , 表示一个结点值的结束(value,)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字...原创 2020-01-06 10:23:27 · 81 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。public TreeNode Convert(TreeNode root) { if (root == null) return null; TreeNode[] pLast = new TreeNode[1]; ...原创 2020-01-04 10:11:26 · 65 阅读 · 0 评论 -
删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5public ListNode deleteDuplication(ListNode pHead) { if (pHead == null) return nul...原创 2020-01-02 19:04:25 · 63 阅读 · 0 评论 -
二维数组中的查找
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。public boolean Find(int target, int [][] array) { if (array == null || array.length ==...原创 2019-12-11 09:44:49 · 64 阅读 · 0 评论 -
二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。public TreeLinkNode getNext(TreeLinkNode node) { if (node == null) return null; TreeLinkNode targe...原创 2019-12-05 16:09:28 · 75 阅读 · 0 评论 -
二叉树中和为某一值的路径
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)private ArrayList<ArrayList<Integer>> listAll = new ArrayList<>(); private A...原创 2019-12-03 21:17:21 · 66 阅读 · 0 评论