![](https://img-blog.csdnimg.cn/20190921235945561.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
剑指Offer
Samven_7
当你发现自己的才华撑不起野心时,就请安静下来学习吧。
展开
-
【剑指Offer】不用加减乘除做加法
【题目】写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。【思路】见 https://cuijiahua.com/blog/2018/01/basis_48.html【代码】javapublic class Solution { public int Add(int num1,int num2) { return num2 != 0 ? Add(num1 ^ num2, (num1 & num2) << 1) : num原创 2020-10-24 20:14:06 · 202 阅读 · 0 评论 -
【剑指Offer】求1+2+3+…+n
【题目】求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。【思路】递归【代码】javapublic class Solution { public int Sum_Solution(int n) { int result = n; boolean b = n > 1 && ((result += Sum_Solution原创 2020-10-24 20:06:16 · 179 阅读 · 0 评论 -
【剑指Offer】孩子们的游戏(圆圈中最后剩下的数)
【题目】每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!_)。请你试着想下,哪个小朋友会得原创 2020-10-20 22:07:50 · 165 阅读 · 0 评论 -
【剑指Offer】扑克牌顺子
【题目】LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。LL决定去买体育彩票啦。 现原创 2020-10-19 16:41:18 · 173 阅读 · 0 评论 -
【剑指Offer】翻转单词顺序列
【题目】牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?【思路】以空格切割,反向连接即可。注意要判输出为空和空串的情况(直接用trim()函数去掉空格再判断)。【代码】javap原创 2020-10-17 22:13:44 · 113 阅读 · 1 评论 -
【剑指Offer】左旋转字符串
【题目】汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!【思路】方法一:直接判断左移后的位置。方法二:例如:输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab";第一步:翻转字符串“ab”,得到"ba";第二步:翻转字原创 2020-10-12 23:02:32 · 122 阅读 · 0 评论 -
【剑指Offer】和为S的两个数字
【题目】题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。输出描述:对应每个测试案例,输出两个数,小的先输出。【思路】设置一个最低指针 low 和最高指针 high ,求和。如果结果大于目标值,high–;如果结果小于目标值,low++;否则相等即找到结果(此时找到的也是乘积最小)。【代码】Javaimport java.util.ArrayList;public class Solution {原创 2020-10-08 22:03:56 · 112 阅读 · 0 评论 -
【剑指Offer】和为S的连续正数序列
【题目】题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序【思路】设置low为1,high为2,使原创 2020-10-05 22:48:22 · 93 阅读 · 0 评论 -
【剑指Offer】数组中只出现一次的数字
【题目】一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。【思路】方法一:哈希表的方法,时间复杂度是O(n^2),但是空间复杂度不是O(1)。方法二:异或的一个性质是:任何一个数字异或它自己都等于0。我们从头到尾一次异或数组中的每一个数字,那么最终得到的结果就是两个只出现一次的数组的异或结果。因为其他数字都出现了两次,在异或中全部抵消了。由于两个数字肯定不一样,那么异或的结果肯定不为0,也就是说这个结果数组的二进制表示至少有一个位为1。我们在结果数组中原创 2020-10-04 23:07:17 · 103 阅读 · 0 评论 -
【剑指Offer】平衡二叉树
【题目】输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树【思路】在 上一题:【剑指Offer】二叉树的深度 的基础上判断每个结点的左右子树高度差。【代码】JavaDFS:public class Solution { private boolean flag = true; public boolean IsBalanced_Solution(TreeNode root) { if (root =原创 2020-10-03 22:42:00 · 106 阅读 · 0 评论 -
【剑指Offer】二叉树的深度
【题目】输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。【思路】DFS(深搜优先搜索)或者BFS(广度优先搜索)都行。【代码】JavaDFS:/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { th原创 2020-10-02 12:32:30 · 143 阅读 · 0 评论 -
【剑指Offer】数字在升序数组中出现的次数
【题目】统计一个数字在升序数组中出现的次数。【思路】二分查找【代码】Java: public class Solution { public int GetNumberOfK(int[] array, int k) { int length = array.length; if(length == 0){ return 0; } int l = 0, r = length - 1, index = -1, mid; while (l <= r) {原创 2020-10-01 11:54:11 · 230 阅读 · 0 评论 -
【剑指Offer】数组中的逆序对
【题目】在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007【思路】使用归并排序,在归并的过程中进行比较,复杂度O(nlogn)O(nlogn)O(nlogn)。【代码】public class Solution { private int sum = 0; public int InversePairs(int [] ar原创 2020-09-22 13:09:01 · 102 阅读 · 0 评论 -
【剑指Offer】第一个只出现一次的字符
【题目】在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)【代码】class Solution {public: int FirstNotRepeatingChar(string str) { int length = str.length(); if(length == 0) return -1; int a[25原创 2020-09-20 10:56:37 · 70 阅读 · 0 评论 -
【剑指Offer】丑数
【题目】把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。【思路】根据丑数的定义, 丑数应该是另一个丑数乘以 2、3 或者 5 的结果(1 除外)。因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以 2、3 或者 5 得到的。这种思路的关键在于怎样确保数组里面的丑数是排好序的。假设数组中已经有若干个丑数排好序后存放在数组中,并且把己有最大的原创 2020-09-16 21:05:25 · 76 阅读 · 0 评论 -
【剑指Offer】把数组排成最小的值
【题目】输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。【思路】最直接的解法应该是先求这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最小值,n个数字总共有n!个排列。在这里我们自己定义一个规则,对拼接后的字符串进行比较。若ab > ba 则 a 大于 b,若ab < ba 则 a 小于 b,若ab = ba 则 a 等于 b;原创 2020-09-15 16:05:04 · 61 阅读 · 0 评论 -
【剑指Offer】两个链表的第一个公共结点
【题目】输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)【思路】方法一:我们可以把两个链表拼接起来,一个是pHead1在前pHead2在后,另一个是pHead2在前pHead1在后。这样,生成了两个相同长度的链表,那么我们只要同时遍历这两个表,就一定能找到公共结点。方法二:我们也可以先让把长的链表的头砍掉,让两个链表长度相同,这样,同时遍历也能找到公共结点。【代码】方法一(C++)/*struct List原创 2020-09-14 20:15:58 · 61 阅读 · 0 评论 -
【剑指Offer】整数中1出现的次数(从1到n整数中1出现的次数)
【题目】求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。【思路】两种方法!分别是暴力解决和使用数学技巧。【代码】1. 暴力解...原创 2019-11-15 22:22:56 · 160 阅读 · 0 评论 -
【剑指Offer】连续子数组的最大和
【题目】HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列...原创 2019-11-11 19:22:37 · 148 阅读 · 0 评论 -
【剑指Offer】最小的K个数
【题目】输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。【思路】最简单暴力的方法就是先用sort排序,然后在遍历输出最小的K个数。复杂度为O(nlogn)O(nlog{n})O(nlogn) 。还有一种更快,时间复杂度为O(nlogk)O(nlog{k})O(nlogk)的方法:我们可以先创建一个大小为k的数据容器...原创 2019-11-03 18:51:37 · 114 阅读 · 0 评论 -
【剑指Offer】数组中出现次数超过一半的数字
【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。【思路】可以采用排序的方法,再计算数字出现的次数。时间复杂度为O(nlogn)O(nlog{n})O(nlogn)。下面介绍一种时间复杂度为O(n)O(n)O(n)的方法。如...原创 2019-10-28 22:16:28 · 152 阅读 · 0 评论 -
【剑指Offer】字符串的排列
【题目】输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。【思路】无重复的字符全排列直接用递归就行,重点处理重复的字符。例如有abb,第一个数与后面两个数交换得bab,bba。 然后a...原创 2019-10-21 23:49:10 · 129 阅读 · 0 评论 -
【剑指Offer】二叉搜索树与双向链表
【题目】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。【思路】根据二叉搜索树的特点:左节点的值 < 根节点的值 < 右节点的值,使用二叉树的中序遍历出来的数据就是排序好(从小到大)的顺序。因此,确定了二叉搜索树的遍历方法。遍历时可以用一个引用的指针来存储上一个节点,这样就可以和当前节点建立双向关系。【代码】...原创 2019-10-20 22:48:48 · 145 阅读 · 0 评论 -
【剑指Offer】复杂链表的复制
【题目】输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)【思路】思路主要是在原来链表的基础上进行复制,分三步:(1)遍历一次,在原链表每个节点后面新建一个和该节点值相同的节点,并插入进去。(2)再遍历一次,处理原链表的ran...原创 2019-10-18 00:09:28 · 116 阅读 · 0 评论 -
【剑指Offer】二叉树中和为某一值的路径
【题目】输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)【思路】首先,理解题意,要我们找是从根节点开始往下到叶节点所经过的节点形成一条路径,满足两点:(1)这条路径要有根节点和一个叶节点。(2)路径的节点值之和要等于题目要求的输入整数。...原创 2019-10-16 15:51:44 · 128 阅读 · 0 评论 -
【剑指Offer】二叉搜索树的后序遍历序列
【题目】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。【思路】二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大...原创 2019-10-14 19:17:51 · 173 阅读 · 0 评论 -
【剑指Offer】从上往下打印二叉树
【题目】从上往下打印出二叉树的每个节点,同层节点从左至右打印。【思路】我们可以开一个辅助队列,先把根结点入队。每次出队一个节点,并把该节点的左右子节点入队(子节点非空)。重复此操作,直至辅助队列变为空。【代码】/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode...原创 2019-10-13 16:13:14 · 104 阅读 · 0 评论 -
【剑指Offer】栈的压入、弹出序列
【题目】输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)【思路】使用一个辅助栈来进行入栈和出栈。如果popV序列中下一个数字刚好是辅助栈的...原创 2019-10-12 19:35:44 · 154 阅读 · 0 评论 -
【剑指Offer】变态跳台阶
【题目】一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。【思路】这道题是前面 跳台阶问题 的延伸。同样的,我们将jumpFloor(number)函数简化为f(n)函数。当n = 1时,跳法只有1种,f(1) = f(1-1) = f(0) = 1;当n = 2时,跳法有2种,f(2) = f(2-1) + f(2-2) = ...原创 2019-09-23 18:41:05 · 76 阅读 · 0 评论 -
【剑指Offer】跳台阶
【题目】一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。【思路】先讨论一般情况,如果只有一级台阶,那么只有一种跳法。如果有两级台阶,那么有两种跳法,分别是先跳一级,再跳一级;或者是直接跳两级。我们将jumpFloor(number)函数简化为f(n)函数,对于n>=2的情况,每次我们都有两种选择,即跳一级或跳两级。...原创 2019-09-22 10:00:07 · 98 阅读 · 1 评论 -
【剑指Offer】斐波那契数列
【题目】大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39【思路】斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368… 这个数列从第3项开...原创 2019-09-20 10:49:33 · 139 阅读 · 0 评论 -
【剑指Offer】旋转数组的最小数字
【题目】把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。【思路】如果直接使用顺序查找,时间复杂度为 O(n)O(n)O(n),完全没用到旋转数组的特性,显然不合适。...原创 2019-09-19 23:39:39 · 85 阅读 · 0 评论 -
【剑指Offer】用两个栈实现队列
【题目】用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。【思路】Push操作可以直接把元素存进其中一个栈,我这里是存在stack1栈中。Pop操作需要结合两个栈。当把元素依次入栈放进栈A,再把栈A的元素依次出栈放进栈B,那么,栈B出栈的顺序就相当于把元素存进队列后的出队顺序。当第一次pop时,stack2为空,则把stack1的所有元素放进stack2...原创 2019-09-17 15:40:35 · 74 阅读 · 0 评论 -
【剑指Offer】重建二叉树
【题目】输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。【思路】本题考查的是重建二叉树,首先要知道二叉树的遍历方式有三种,分别是先序遍历(前序遍历)、中序遍历和后序遍历。想要重建二叉树,只能通过先序加中序,...原创 2019-09-16 19:25:18 · 74 阅读 · 0 评论 -
【剑指Offer】从尾到头打印链表
【题目】输入一个链表,按链表从尾到头的顺序返回一个ArrayList。【思路】两种方法。【代码】方法一按链表从尾到头的顺序返回,想到栈的“后进先出”。从前往后遍历链表,把结点值放到栈中。当遍历结束后,再把栈中的结点值逐个放进vector容器中,这样就实现了链表值的反转。/*** struct ListNode {* int val;* str...原创 2019-09-16 15:22:24 · 79 阅读 · 0 评论 -
【剑指Offer】替换空格
【题目】请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。【思路】先遍历str一次,记录空格的个数。再计算新的字符长度,即原长度length加上把空格替换成“%20”所需的长度(替换长度只需把空格的个数乘上2,而不是3,因为原长度length中空格已经占一位)。最后从后...原创 2019-09-15 15:52:48 · 85 阅读 · 0 评论 -
【剑指Offer】矩形覆盖
【题目】我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?【思路】分析可知,从左往右(或从右往左)摆的时候,可以选择竖着摆1个小矩形,或者横着摆,但必须上下连续横着摆两个,否则不能全部覆盖大矩形。因此,用递归的思想就是每次有两种选择(number可以看成是大矩形的宽):1)竖着摆1个小矩形,number则减1;...原创 2019-09-25 15:47:34 · 67 阅读 · 0 评论 -
【剑指Offer】二进制中1的个数
【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。【思路】两种方法。【代码】方法一对于正数,处理方法很简单,一边和’1’做与运算并计数,一边右移,直到正数变为0。对于负数,我们知道在C++中是以补码的形式存储,比如-7 在计算机中表达为:11111111 11111111 11111111 11111001。这里要注意,负数右移是在最高位补’1’,所以如...原创 2019-09-28 20:03:27 · 84 阅读 · 0 评论 -
【剑指Offer】数值的整数次方
【题目】给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0【思路】考虑几种情况:(1)考虑base为0或exponent为0的情况。(2)考虑exponent为负数的情况。可以先对指数exponent求绝对值,然后计算出结果之后再取倒数。注意:对于浮点数的比较,不能直接用等号(==)判...原创 2019-09-29 20:00:05 · 85 阅读 · 0 评论 -
【剑指Offer】包含min函数的栈
【题目】定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。【思路】定义两个栈Data和Min,一个用来存放所有数据,一个用来存放当前的最小值。模拟一遍思路:(1)Data进栈3,当前最小值是3,所以Min也进栈3。【栈Data:3】【栈Min:3】(2)Data进栈4,4比之前的最小值3大,当前最小值还是3,所以Min进栈3。【栈Da...原创 2019-10-11 19:55:27 · 109 阅读 · 0 评论