剑指Offer
璀璨下的一点星辰
这个作者很懒,什么都没留下…
展开
-
58.剑指Offer-数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路两个不相等的元素在位级表示上必定会有一位存在不同,将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区...原创 2019-04-03 15:06:13 · 92 阅读 · 0 评论 -
71.剑指Offer-把字符串转换成整数
题目描述将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描...原创 2019-04-05 13:09:38 · 101 阅读 · 0 评论 -
70.剑指Offer-构建乘积数组
题目描述给定一个数组 A[0, 1,..., n-1],请构建一个数组 B[0, 1,..., n-1],其中 B 中的元素 B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。要求不能使用除法。解题思路public int[] multiply(int[] A) { int n = A.length; int[] B = ne...原创 2019-04-05 13:09:20 · 111 阅读 · 0 评论 -
69.剑指Offer-不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求不得使用 +、-、*、/ 四则运算符号。解题思路a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。public int Add...原创 2019-04-05 13:09:11 · 116 阅读 · 0 评论 -
68.剑指Offer-求 1+2+3+...+n
题目描述要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 A ? B : C。解题思路使用递归解法最重要的是指定返回条件,但是本题无法直接使用 if 语句来指定返回条件。条件与 && 具有短路原则,即在第一个条件语句为 false 的情况下不会去执行第二个条件语句。利用这一特性,将递归的返回条件取非然后作为 &a...原创 2019-04-04 22:02:55 · 189 阅读 · 0 评论 -
67.剑指Offer-股票的最大利润
题目描述假设您有一个数组,其中第i个元素是第一天给定股票的价格。如果你只被允许完成至多一笔交易(即买一份,卖一份股票),设计一个算法来找到最大利润。请注意,在购买股票之前,您不能出售股票。可以有一次买入和一次卖出,那么买入必须在前。求最大收益。Example 1:Input: [7,1,5,3,6,4]Output: 5Explanation: Buy on day...原创 2019-04-04 21:58:21 · 414 阅读 · 0 评论 -
66.剑指Offer-圆圈中最后剩下的数(不懂)
题目描述每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去.....原创 2019-04-04 21:51:23 · 108 阅读 · 0 评论 -
65.剑指Offer-扑克牌顺子
题目描述LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K...原创 2019-04-04 21:29:33 · 206 阅读 · 0 评论 -
64.剑指Offer-n 个骰子的点数
题目描述把 n 个骰子仍在地上,求点数和为 s 的概率。扔n个骰子,向上面的数字之和为S。给定n,请列出所有可能的S值及其相应的概率。样例 1:输入:n = 1输出:[[1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]解释:掷一次骰子,向上的数字和可能为1,2,3,4,5,6,出现...原创 2019-04-04 21:18:26 · 949 阅读 · 0 评论 -
49.剑指Offer-礼物的最大价值
题目描述小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值...原创 2019-03-31 15:26:34 · 225 阅读 · 0 评论 -
34.剑指Offer-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解题思路 二叉查找树(Binary Search Tr...原创 2019-03-27 08:33:49 · 93 阅读 · 0 评论 -
63.剑指Offer-左旋转字符串
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,...原创 2019-04-04 15:41:17 · 107 阅读 · 0 评论 -
62.剑指Offer-左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!Input:S="abcXYZdef"K=3Output:"XYZdefabc"...原创 2019-04-04 15:19:22 · 85 阅读 · 0 评论 -
61.剑指Offer-翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?Input:"I...原创 2019-04-04 15:14:39 · 137 阅读 · 0 评论 -
60.剑指Offer-和为 S 的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出所有和为 S 的连续正数序列。...原创 2019-04-04 14:57:59 · 75 阅读 · 0 评论 -
59.剑指Offer-1 和为 S 的两个数字
题目描述输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。输出结果对应每个测试案例,输出两个数,小的先输出。解题思路使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。 如果两个指针指向元素的和 sum == ta...原创 2019-04-04 13:41:24 · 141 阅读 · 0 评论 -
24.剑指Offer-合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路递归public ListNode Merge(ListNode list1, ListNode list2) { if (list1 == null) return list2; if (list2 == null) ...原创 2019-03-23 18:56:47 · 97 阅读 · 0 评论 -
72.剑指Offer-树中两个节点的最低公共祖先(再看一遍)
解题思路二叉查找树二叉查找树中,两个节点 p, q 的公共祖先 root 满足 root.val >= p.val && root.val <= q.val。public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null...原创 2019-04-05 13:09:53 · 129 阅读 · 0 评论 -
35.剑指Offer-二叉树中和为某一值的路径(再看看)
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。下图的二叉树有两条和为 22 的路径:10, 5, 7 和 10, 12解题思路private ArrayList<ArrayList<Integer>> ret = new ArrayList<&g...原创 2019-03-27 13:12:41 · 108 阅读 · 0 评论 -
36.剑指Offer-复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的 head。public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; R...原创 2019-03-27 13:23:59 · 99 阅读 · 0 评论 -
57.剑指Offer-平衡二叉树
题目描述平衡二叉树左右子树高度差不超过 1。输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路private boolean isBalanced = true;public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced;}private ...原创 2019-04-03 08:41:31 · 114 阅读 · 0 评论 -
56.剑指Offer-二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路public int TreeDepth(TreeNode root) { return root == null ? 0 : 1 + Math...原创 2019-04-02 20:31:46 · 104 阅读 · 0 评论 -
55.剑指Offer-二叉查找树的第 K 个结点
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。解题思路利用二叉查找树中序遍历有序的特点。private TreeNode ret;private int cnt = 0;public TreeNode KthNode(TreeNode pRoot, int k) { in...原创 2019-04-02 20:10:58 · 112 阅读 · 0 评论 -
54.剑指Offer-数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4解题思路题是用了一个二分查找,确实是更快一些。public int GetNumberOfK(int[] nums, int K) { int first = binarySearch(nums, K); in...原创 2019-04-02 19:00:34 · 98 阅读 · 0 评论 -
53.剑指Offer-两个链表的第一个公共结点(逻辑比较简单,不过有面试考过这道题)
题目描述输入两个链表,找出它们的第一个公共结点。解题思路设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问链表 A 的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问链表 B 的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就能控制...原创 2019-04-02 15:46:18 · 260 阅读 · 0 评论 -
52.剑指Offer-数组中的逆序对(merge方法有点抽象)
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。private long cnt = 0;private int[] tmp; // 在这里声明辅助数组,而不是在 merge() 递归函数中声明public int InversePairs(int[] nums) { tmp = ne...原创 2019-04-02 15:38:03 · 122 阅读 · 0 评论 -
51.剑指Offer-第一个只出现一次的字符位置
题目描述在一个字符串中找到第一个只出现一次的字符,并返回它的位置。解题思路最直观的解法是使用 HashMap 对出现次数进行统计,但是考虑到要统计的字符范围有限,因此可以使用整型数组代替 HashMap。public int FirstNotRepeatingChar(String str) { //存的是ascii碼 int[] cnts = new int[...原创 2019-04-02 14:44:02 · 158 阅读 · 0 评论 -
43.剑指Offer-字符流中第一个不重复的字符
题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符 "go" 时,第一个只出现一次的字符是 "g"。当从该字符流中读出前六个字符“google" 时,第一个只出现一次的字符是 "l"。解题思路private int[] cnts = new int[256];private Queue<Character> queue = ...原创 2019-03-28 20:56:12 · 130 阅读 · 0 评论 -
42.剑指Offer-数据流中的中位数(使用堆排序和PriorityQueue)
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用In...原创 2019-03-28 20:22:33 · 211 阅读 · 0 评论 -
41.剑指Offer-最小的 K 个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路快速选择复杂度:O(N) + O(1) 只有当允许修改数组元素时才可以使用快速排序的 partition() 方法,会返回一个整数 j 使得 a[l..j-1] 小于等于 a[j],且 a[j+1..h] 大于等于 a[j],此时 a[j] ...原创 2019-03-28 19:00:14 · 114 阅读 · 0 评论 -
50.剑指Offer-丑数
题目描述把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。public int GetUglyNumber_Solution(int N) { if (N <= 6) return N; int i2...原创 2019-04-02 09:09:54 · 87 阅读 · 0 评论 -
49.剑指Offer-最长不含重复字符的子字符串(再看一遍)
题目描述输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。解题思路public int longestSubStringWithoutDuplication(String str) { int curLen = 0; int maxLen = 0; ...原创 2019-04-02 07:28:58 · 147 阅读 · 0 评论 -
40.剑指Offer-数组中出现次数超过一半的数字
解题思路多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素相等时,令 cnt++,否则令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于...原创 2019-03-27 16:20:03 · 76 阅读 · 0 评论 -
39.剑指Offer-字符串的排列(没懂)
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串 abc,则打印出由字符 a, b, c 所能排列出来的所有字符串 abc, acb, bac, bca, cab 和 cba。private ArrayList<String> ret = new ArrayList<>();public ArrayList<String&g...原创 2019-03-27 15:40:54 · 122 阅读 · 0 评论 -
38.剑指Offer-序列化二叉树(需要再看一遍)
题目描述请实现两个函数,分别用来序列化和反序列化二叉树。解题思路private String deserializeStr;public String Serialize(TreeNode root) { if (root == null) return "#"; return root.val + " " + Serialize(root.lef...原创 2019-03-27 15:28:28 · 115 阅读 · 0 评论 -
37.剑指Offer-二叉搜索树与双向链表(还是不太熟)
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解题思路private TreeNode pre = null;private TreeNode head = null;public TreeNode Convert(TreeNode root) { inOrder(root); re...原创 2019-03-27 14:55:45 · 80 阅读 · 0 评论 -
23.剑指Offer-反转链表
题目描述输入一个链表,反转链表后,输出新链表的表头。解题思路递归public ListNode ReverseList(ListNode head) { if (head == null || head.next == null) return head; ListNode next = head.next; head.next = nul...原创 2019-03-23 17:43:53 · 91 阅读 · 0 评论 -
48.剑指Offer-把数字翻译成字符串
题目描述给定一个数字,按照如下规则翻译成字符串:1 翻译成“a”,2 翻译成“b”... 26 翻译成“z”。一个数字有多种翻译可能,例如 12258 一共有 5 种,分别是 abbeh,lbeh,aveh,abyh,lyh。实现一个函数,用来计算一个数字有多少种不同的翻译方法。解题思路public int numDecodings(String s) { if (s == ...原创 2019-03-30 15:29:37 · 199 阅读 · 0 评论 -
11.剑指Offer-机器人的运动范围
题目描述地上有一个 m 行和 n 列的方格。一个机器人从坐标 (0, 0) 的格子开始移动,每一次只能向左右上下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 k 的格子。例如,当 k 为 18 时,机器人能够进入方格 (35,37),因为 3+5+3+7=18。但是,它不能进入方格 (35,38),因为 3+5+3+8=19。请问该机器人能够达到多少个格子?privat...原创 2019-03-18 19:08:30 · 100 阅读 · 0 评论 -
27.剑指Offer-对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。boolean isSymmetrical(TreeNode pRoot) { if (pRoot == null) return true; return isSymmetrical(pRoot.left, pRoot.right);...原创 2019-03-25 14:46:08 · 116 阅读 · 0 评论