剑指Offer
剑指Offer
解夏(̿▀̿ ̿Ĺ̯̿̿▀̿ ̿)
这个作者很懒,什么都没留下…
展开
-
树中两个结点的最低公共祖先
树中两个结点的最低公共祖先给出一个二叉树,输入两个树节点,求它们的最低公共祖先。一个树节点的祖先节点包括它本身。注意:输入的二叉树不为空;输入的两个节点一定不为空,且是二叉树中的节点;样例二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 41. 如果输入的树节点为2和12,则输出的最低公共祖先为树节点8。2. 如果输入的树节点为2和6,则输原创 2020-10-15 10:08:22 · 178 阅读 · 0 评论 -
把字符串转换成整数
把字符串转换成整数请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。注意:你的函数应满足下列条件:忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;整数后可能有任意非数字字符,请将其忽略;如果整数长度为0,则返回0;如果整数大于INT_MAX(2^31 − 1),请返回INT_MAX;如果整数小于INT_MIN(−2^31) ,请返回INT_MIN;样原创 2020-10-15 10:08:12 · 175 阅读 · 0 评论 -
构建乘积数组
构建乘积数组给定一个数组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]。不能使用除法。思考题:能不能只使用常数空间?(除了输出的数组之外)样例输入:[1, 2, 3, 4, 5]输出:[120, 60, 40, 30, 24]数学时间复杂度O(n)class Solution { public int[] multiply(int[] A) {原创 2020-10-15 10:08:04 · 112 阅读 · 0 评论 -
不用加减乘除做加法
不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷ 四则运算符号。样例输入:num1 = 1 , num2 = 2输出:3数学时间复杂度O(n)class Solution { public int add(int num1, int num2) { int sum = 0,carry = 0; while(num2 != 0){ sum = num1 ^ num2; ca原创 2020-10-14 10:10:15 · 62 阅读 · 0 评论 -
求1+2+…+n
求1+2+…+n求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。样例输入:10输出:55递归时间复杂度O(n)class Solution { public int getSum(int n) { boolean flag = (n > 0) && ((n += getSum(n - 1)) > 0); return n; }}原创 2020-10-14 10:10:03 · 87 阅读 · 0 评论 -
股票的最大利润
股票的最大利润假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖 一次 该股票可能获得的利润是多少?例如一只股票在某些时间节点的价格为[9, 11, 8, 5, 7, 12, 16, 14]。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。样例输入:[9, 11, 8, 5, 7, 12, 16, 14]输出:11数学时间复杂度O(n)class Solution { public int maxDiff(int[] nums) {原创 2020-10-14 10:09:55 · 114 阅读 · 0 评论 -
圆圈中最后剩下的数字
圆圈中最后剩下的数字0, 1, …, n-1这n个数字(n>0)排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。样例输入:n=5 , m=3输出:3递归时间复杂度O(n)class Solution { public int lastRemaining(int n, int m) { if(n == 1){ return 0; } return (lastRem原创 2020-10-14 10:09:45 · 72 阅读 · 0 评论 -
扑克牌的顺子
扑克牌的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,大小王可以看做任意数字。为了方便,大小王均以0来表示,并且假设这副牌中大小王均有两张。样例1输入:[8,9,10,11,12]输出:true样例2输入:[0,8,9,11,12]输出:true遍历时间复杂度O(n)class Solution { public boolean isContinuous(int [] numbers) {原创 2020-10-14 10:09:39 · 231 阅读 · 0 评论 -
骰子的点数
骰子的点数将一个骰子投掷n次,获得的总点数为s,s的可能范围为n~6n。掷出某一点数,可能有多种掷法,例如投掷2次,掷出3点,共有[1,2],[2,1]两种掷法。请求出投掷n次,掷出n~6n点分别有多少种掷法。样例1输入:n=1输出:[1, 1, 1, 1, 1, 1]解释:投掷1次,可能出现的点数为1-6,共计6种。每种点数都只有1种掷法。所以输出[1, 1, 1, 1, 1, 1]。样例2输入:n=2输出:[1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]解释:投原创 2020-10-14 10:09:33 · 1525 阅读 · 0 评论 -
滑动窗口的最大值
滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组[2, 3, 4, 2, 6, 2, 5, 1]及滑动窗口的大小3,那么一共存在6个滑动窗口,它们的最大值分别为[4, 4, 6, 6, 6, 5]。注意:数据保证k大于0,且k小于等于数组长度。样例输入:[2, 3, 4, 2, 6, 2, 5, 1] , k=3输出: [4, 4, 6, 6, 6, 5]优先级队列时间复杂度O(n)class Solution { public i原创 2020-10-14 10:09:17 · 122 阅读 · 0 评论 -
左旋转字符串
左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。注意:数据保证n小于等于输入字符串的长度。样例输入:"abcdefg" , n=2输出:"cdefgab"遍历时间复杂度O(n)class Solution { public String leftRotateString(String str,int n) {原创 2020-10-14 10:09:09 · 74 阅读 · 0 评论 -
翻转单词顺序
翻转单词顺序输入一个英文句子,单词之前用一个空格隔开,且句首和句尾没有多余空格。翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。样例输入:"I am a student."输出:"student. a am I"遍历时间复杂度O(n)class Solution { public String reverseWords(String s) {原创 2020-10-14 10:09:01 · 299 阅读 · 0 评论 -
和为S的连续正数序列
和为S的连续正数序列输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打印出3个连续序列1~5、4~6和7~8。样例输入:15输出:[[1,2,3,4,5],[4,5,6],[7,8]]双指针时间复杂度O(n)class Solution { public List<List<Integer> > findContinuousSequence(int sum) {原创 2020-10-14 10:08:53 · 128 阅读 · 0 评论 -
和为S的两个数字
和为S的两个数字输入一个数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。你可以认为每组输入中都至少含有一组满足条件的输出。样例输入:[1,2,3,4] , sum=7输出:[3,4]Map时间复杂度O(n)class Solution { public int[] findNumbersWithSum(int[] nums, int target) { int[] res = new int[2];原创 2020-10-13 10:16:01 · 76 阅读 · 0 评论 -
数组中唯一只出现一次的数字
数组中唯一只出现一次的数字在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。你可以假设满足条件的数字一定存在。思考题:如果要求只使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?样例输入:[1,1,1,2,2,2,3,4,4,4]输出:3数学时间复杂度O(n)class Solution { public int findNumberAppearingOnce(int[] nums) { int[] sums原创 2020-10-13 10:15:24 · 76 阅读 · 0 评论 -
数组中只出现一次的两个数字
数组中只出现一次的两个数字一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。你可以假设这两个数字一定存在。样例输入:[1,2,3,3,4,4]输出:[1,2]数学时间复杂度O(n)class Solution { public int[] findNumsAppearOnce(int[] nums) { int xy = 0; for(int num : nums){ xy ^= n原创 2020-10-13 10:15:15 · 128 阅读 · 0 评论 -
平衡二叉树
平衡二叉树输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。注意:规定空树也是一棵平衡二叉树。样例输入:二叉树[5,7,11,null,null,12,9,null,null,null,null]如下所示, 5 / \ 7 11 / \ 12 9输出:trueDFS时间复杂度O(n)class Solution { boolean ans = true;原创 2020-10-13 10:15:02 · 71 阅读 · 0 评论 -
二叉树的深度
二叉树的深度输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。样例输入:二叉树[8, 12, 2, null, null, 6, 4, null, null, null, null]如下图所示: 8 / \ 12 2 / \ 6 4输出:3DFS时间复杂度O(n)class Solution { public int treeDepth(TreeNode root原创 2020-10-13 10:14:54 · 102 阅读 · 0 评论 -
二叉搜索树的第k个结点
二叉搜索树的第k个结点给定一棵二叉搜索树,请找出其中的第k小的结点。你可以假设树和k都存在,并且1≤k≤树的总结点数。样例输入:root = [2, 1, 3, null, null, null, null] ,k = 3 2 / \ 1 3输出:3DFS时间复杂度O(n)class Solution { int index = 0; public TreeNode kthNode(TreeNode root, int k) { if原创 2020-10-13 10:14:42 · 68 阅读 · 0 评论 -
数组中数值和下标相等的元素
数组中数值和下标相等的元素假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数找出数组中任意一个数值等于其下标的元素。例如,在数组[-3, -1, 1, 3, 5]中,数字3和它的下标相等。注意:如果不存在,则返回-1。样例输入:[-3, -1, 1, 3, 5]输出:3二分时间复杂度O(n)class Solution { public int getNumberSameAsIndex(int[] nums) { int left = 0原创 2020-10-13 10:14:33 · 216 阅读 · 0 评论 -
0到n-1中缺失的数字
0到n-1中缺失的数字一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。样例输入:[0,1,2,4]输出:3二分时间复杂度O(logn)class Solution { public int getMissingNumber(int[] nums) { int left = 0; int right = nums.length - 1;原创 2020-10-13 10:14:25 · 171 阅读 · 0 评论 -
数字在排序数组中出现的次数
数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。例如输入排序数组[1, 2, 3, 3, 3, 3, 4, 5]和数字3,由于3在这个数组中出现了4次,因此输出4。样例输入:[1, 2, 3, 3, 3, 3, 4, 5] , 3输出:4Map时间复杂度O(n)class Solution { public int getNumberOfK(int[] nums, int k) { Map<Integer,Integer> map = n原创 2020-10-13 10:14:17 · 79 阅读 · 0 评论 -
两个链表的第一个公共结点
两个链表的第一个公共结点输入两个链表,找出它们的第一个公共结点。当不存在公共节点时,返回空节点。样例给出两个链表如下所示:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3输出第一个公共节点c1Map时间复杂度O(n)class Solution { public ListNode原创 2020-10-13 10:14:08 · 86 阅读 · 0 评论 -
数组中的逆序对
数组中的逆序对在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。样例输入:[1,2,3,4,5,6,0]输出:6归并时间复杂度O(nlogn)class Solution { int count = 0; public int inversePairs(int[] nums) { meger(nums,0,nums.length-1); return count;原创 2020-10-12 22:22:29 · 124 阅读 · 0 评论 -
字符流中第一个只出现一次的字符
字符流中第一个只出现一次的字符请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是’g’。当从该字符流中读出前六个字符”google”时,第一个只出现一次的字符是’l’。如果当前字符流没有存在出现一次的字符,返回#字符。样例输入:"google"输出:"ggg#ll"解释:每当字符流读入一个字符,就进行一次判断并输出当前的第一个只出现一次的字符。遍历时间复杂度O(n)class Solution {原创 2020-10-12 22:17:55 · 125 阅读 · 0 评论 -
字符串中第一个只出现一次的字符
字符串中第一个只出现一次的字符在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出b。如果字符串中不存在只出现一次的字符,返回#字符。样例:输入:"abaccdeff"输出:'b'遍历时间复杂度O(n)class Solution { public char firstNotRepeatingChar(String s) { Map<Character,Integer> map = new HashMap(); c原创 2020-10-12 22:15:27 · 381 阅读 · 0 评论 -
丑数
丑数我们把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。求第n个丑数的值。注意:习惯上我们把1当做第一个丑数。样例输入:5输出:5数学时间复杂度O(n)class Solution { public int getUglyNumber(int n) { if(n <= 0){ return 0; } int[] res = new i原创 2020-10-12 11:43:46 · 94 阅读 · 0 评论 -
最长不含重复字符的子字符串
最长不含重复字符的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从’a’到’z’的字符。样例输入:"abcabc"输出:3遍历时间复杂度O(n)class Solution { public int longestSubstringWithoutDuplication(String s) { if(s == null || s.length() == 0){ return 0;原创 2020-10-12 11:43:40 · 140 阅读 · 0 评论 -
礼物的最大价值
礼物的最大价值在一个m×n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物?注意:m,n>0样例:输入:[ [2,3,1], [1,7,1], [4,6,1]]输出:19解释:沿着路径 2→3→7→6→1 可以得到拿到最大价值礼物。DP时间复杂度O(n^2)class Solution {原创 2020-10-12 11:43:33 · 143 阅读 · 0 评论 -
把数字翻译成字符串
把数字翻译成字符串给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成”a”,1翻译成”b”,……,11翻译成”l”,……,25翻译成”z”。一个数字可能有多个翻译。例如12258有5种不同的翻译,它们分别是”bccfi”、”bwfi”、”bczi”、”mcfi”和”mzi”。请编程实现一个函数用来计算一个数字有多少种不同的翻译方法。样例输入:"12258"输出:5DP时间复杂度O(n)class Solution { public int getTranslationCo原创 2020-10-12 11:43:23 · 120 阅读 · 0 评论 -
把数组排成最小的数
把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组[3, 32, 321],则打印出这3个数字能排成的最小数字321323。注意:输出数字的格式为字符串。样例输入:[3, 32, 321]输出:321323比较器时间复杂度O(nlogn)class Solution { public String printMinNumber(int[] nums) { int n = nums.length原创 2020-10-12 11:43:17 · 174 阅读 · 0 评论 -
数字序列中某一位的数字
数字序列中某一位的数字数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数求任意位对应的数字。样例输入:13输出:1、数学时间复杂度O(n)class Solution { public int digitAtIndex(int n) { int i = 1;//几位数 long s = 9;//s表示位数共有多少个,一定要用Lon原创 2020-10-12 11:43:10 · 93 阅读 · 0 评论 -
从1到n整数中1出现的次数
从1到n整数中1出现的次数输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含“1”的数字有1,10,11和12,其中“1”一共出现了5次。样例输入: 12输出: 5数学时间复杂度O(logn)class Solution { static public int numberOf1Between1AndN_Solution(final int n) { int sum = 0; int ab = n; int d原创 2020-10-12 11:43:03 · 133 阅读 · 0 评论 -
连续子数组的最大和
连续子数组的最大和输入一个 非空 整型数组,数组里的数可能为正,也可能为负。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。样例输入:[1, -2, 3, 10, -4, 7, 2, -5]输出:18遍历时间复杂度O(n)class Solution { public int maxSubArray(int[] nums) { int max = nums[0]; int sum = nums[0];原创 2020-10-11 21:55:53 · 1560 阅读 · 0 评论 -
数据流中的中位数
数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。样例输入:1, 2, 3, 4输出:1,1.5,2,2.5解释:每当数据流读入一个数据,就进行一次判断并输出当前的中位数。优先级队列时间复杂度O(logn)class Solution { PriorityQueue<Integer> minheap = new原创 2020-10-11 21:51:42 · 207 阅读 · 0 评论 -
最小的k个数
最小的k个数输入n个整数,找出其中最小的k个数。注意:数据保证k一定小于等于输入数组的长度;输出数组内元素请按从小到大顺序排序;样例输入:[1,2,3,4,5,6,7,8] , k=4输出:[1,2,3,4]优先级队列时间复杂度O(nlogn)class Solution { public List<Integer> getLeastNumbers_Solution(int [] input, int k) { //创建一个大顶堆,保存k个元素,如果原创 2020-10-11 21:46:04 · 184 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。假设数组非空,并且一定存在满足条件的数字。思考题:假设要求只能使用 O(n) 的时间和额外 O(1) 的空间,该怎么做呢?样例输入:[1,2,1,1,3]输出:1数学时间复杂度O(n)class Solution { public int moreThanHalfNum_Solution(int[] nums) { int val = nums[0]; in原创 2020-10-11 21:39:10 · 188 阅读 · 0 评论 -
数字排列
数字排列输入一组数字(可能包含重复数字),输出其所有的排列方式。样例输入:[1,2,3]输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]回溯时间复杂度O(n!)class Solution { public List<List<Integer>> permutation(int原创 2020-10-11 21:30:22 · 296 阅读 · 0 评论 -
序列化二叉树
序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树。您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。注意:以上的格式是AcWing序列化二叉树的方式,你不必一定按照此格式,所以可以设计出一些新的构造方式。样例你可以序列化如下的二叉树 8 / \ 12 2 / \ 6 4为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"队列时间复杂度O(n)cla原创 2020-10-11 21:21:00 · 80 阅读 · 0 评论 -
二叉搜索树与双向链表
二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。注意:需要返回双向链表最左侧的节点。例如,输入下图中左边的二叉搜索树,则输出右边的排序双向链表。递归时间复杂度O(n)class Solution { TreeNode tree; TreeNode begin; public TreeNode convert(TreeNode root) { if(root == n原创 2020-10-11 21:18:28 · 72 阅读 · 0 评论