编程题___剑指Offer
洞玄之
不积跬步,无以至千里
展开
-
剑60—把二叉树打印成多行(按层)
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思想二叉树打印,队列思想 1、新建当前所在层节点的队列queue,根节点入队列2、如果队列queue不为空2.1新建缓冲队列buff,存放当前节点的孩子节点 新建集合al,存放当前层的节点 2.2 如果队列queue不为空,poll出栈顶元素即为cur,将当前元素值加入集合al ...原创 2018-04-27 23:21:27 · 133 阅读 · 0 评论 -
剑49—把字符串转换成整数
题目描述将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0 输入描述: 输入一个字符串,包括数字字母符号,可以为空 输出描述: 如果是合法的数值表达则返回该数字,否则返回0 示例1 输入 +2147483647 1a33 输出 2147483647 0解题思路public class ...原创 2018-04-13 23:33:14 · 128 阅读 · 0 评论 -
剑48—不用加减乘除 求两个整数之和
题目描述写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解题思路a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。//简单写法pub...原创 2018-04-13 22:59:09 · 212 阅读 · 0 评论 -
剑47—求1+2+3+...+n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路:1.需利用逻辑与的短路特性实现递归终止。 2.当n==0时,(n>0)&&((sum+=Sum_Solution(n-1))>0)只执行前面的判断,为false,然后直接返回0; 3.当n>0...原创 2018-04-13 22:56:30 · 118 阅读 · 0 评论 -
剑45—扑克牌顺子(数组元素是不是连着的)
题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…..LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。...原创 2018-04-13 22:09:17 · 231 阅读 · 0 评论 -
剑44—翻转单词顺序列(I am a student.->student. a am I)
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?输入:”I am a...原创 2018-04-13 18:03:57 · 558 阅读 · 0 评论 -
剑01—二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路从右上角开始查找。因为矩阵中的一个数,它左边的数都比它小,下边的数都比它大。因此,从右上角开始查找,就可以根据 target 和当前元素的大小关系来缩小查找区间。复杂度:O(M+N) + O(1)p...原创 2017-10-12 22:38:30 · 332 阅读 · 0 评论 -
剑43—左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路public class Solution { //解法1:利用ja...原创 2018-04-13 11:34:10 · 98 阅读 · 0 评论 -
剑42—和为是S的两个数字 (递增排序数组)
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。解题思路使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。如果两个指针指向元素的和 sum == targ...原创 2018-04-12 23:13:51 · 159 阅读 · 0 评论 -
剑41—和为S的连续正数序列
剑41—和为S的连续正数序列题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述...原创 2018-04-12 23:08:12 · 115 阅读 · 0 评论 -
剑指40—数组中只出现一次的数字(其他都出现两次)
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 例如 输入{2,4,3,6,3,2,5,5} 输出 4,6解题思路异或思想:任何一个数字异或它自己都等于0;两个不相等的元素在位级表示上必定会有一位存在不同。将数组的所有元素异或得到的结果为只出现一次的两个元素异或的结果。由于这两个数字肯定不一样,那么这个异或结果肯...原创 2018-04-12 22:47:49 · 125 阅读 · 0 评论 -
剑50—数组中重复的数字
题目描述在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 示例1 输入{2,3,1,0,2,5,3}, 输出 2解题思路//我自己的思想ACimport ...原创 2018-04-14 10:00:59 · 172 阅读 · 1 评论 -
剑61—序列化、反序列化二叉树
题目描述请实现两个函数,分别用来序列化和反序列化二叉树/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/pub...原创 2018-05-02 22:41:45 · 130 阅读 · 0 评论 -
剑59—之字形打印二叉树
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。解题思路剑指思路1:栈的思想 若当前打印奇数层,从右到左打印下一个,则从左到右入栈 若当前打印偶数层,从左到右打印下一个,则从右到左入栈思路2:队列+反转 将每层的数据存进**队列**queue中,偶数层时进行reve...原创 2018-04-27 23:07:50 · 138 阅读 · 0 评论 -
剑58—对称的二叉树
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解题思路通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的,如果两个序列是一样的,则二叉树就是对称的。代码如下/*public class TreeNode { int val = 0; TreeNode left ...原创 2018-04-26 23:06:10 · 117 阅读 · 0 评论 -
剑57—二叉树的下一个节点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。/*public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right = null; TreeLinkNode n...原创 2018-04-20 23:28:00 · 108 阅读 · 0 评论 -
剑56—删除链表中重复的结点
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5/* public class ListNode { int val; ListNode next = null; ListNode(i...原创 2018-04-20 23:26:50 · 102 阅读 · 0 评论 -
剑55—链表的环的入口结点
题目描述 一个链表中包含环,请找出该链表的环的入口结点。/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.HashSet;public class...原创 2018-04-20 23:25:42 · 109 阅读 · 0 评论 -
剑54—字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 输出描述: 如果当前字符流没有存在出现一次的字符,返回#字符。import java.util.*;public class Solution{ /*...原创 2018-04-20 23:24:32 · 125 阅读 · 0 评论 -
剑53—表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串”+100”,”5e2”,”-123”,”3.1416”和”-1E-16”都表示数值。 但是”12e”,”1a3.14”,”1.2.3”,”+-5”和”12e+4.3”都不是。public class Solution { //Double.parseDouble方法是把数字类型的字符串,转换成doub...原创 2018-04-20 23:23:02 · 150 阅读 · 0 评论 -
剑52—正则表达式匹配
题目描述请实现一个函数用来匹配包括’.’和’‘的正则表达式。模式中的字符’.’表示任意一个字符,而’‘表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但是与”aa.a”和”ab*a”均不匹配解题思路:当模式中的第二个字符不是“*”时: 1、如果字符串第一个字符和模式中的第一个...原创 2018-04-20 23:20:24 · 131 阅读 · 0 评论 -
剑51—构建乘积数组
题目描述 给定一个数组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]。不能使用除法。import java.util.ArrayList;public class Solution { /*剑指的思路:B[i]的值可以看作下图的矩阵中每行的乘积。下三角用连乘可以很容...原创 2018-04-20 23:18:10 · 132 阅读 · 0 评论 -
剑62—二叉搜索树的第k大的结点
题目描述给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。解题思想按照中序遍历的顺序遍历一颗二叉搜索树,遍历序列的数值是递增排序的。则很容易找到第k大个数/*public class TreeNode { int val = 0; TreeNode left = null...原创 2018-05-02 23:01:20 · 110 阅读 · 0 评论 -
剑38—二叉树的深度 || 剑39— 平衡二叉树
剑39—二叉树的深度题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路:如果一棵树只有一个节点,则深度为1; 如果根节点只有左子树而没有右子树,则树的深度=左子树深度+1; 如果根节点只有右子树而没有左子树,则树的深度=右子树深度+1; 如果根节点既有左子树又有右子树,则树的深度=1...原创 2018-04-12 21:46:06 · 100 阅读 · 0 评论 -
剑指37—数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数解题思想:遇见排序数组,首先想到二分查找 利用二分查找,在数组中找到第一个k出现下标,再找到最后一个k,下标相减加一即可。 二分查找算法分析查找第一个k:先拿数组中间的数字和k进行比较, 1、如果中间的数字比k大,则k出现在数组的前半段,下一轮只需要在数组的前半段查找即可; 2、如果中间的数字比k大,则k出现在数组的后半段,下一轮只...原创 2018-04-12 21:27:45 · 121 阅读 · 0 评论 -
剑19—顺时针打印矩阵
题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.思路: 1、二维数组的行列数,row,col 2、特殊测试用例判断 3、每圈对应的左上角坐标(start,start)...原创 2017-10-25 12:45:14 · 376 阅读 · 0 评论 -
剑02-—替换空格
题目描述 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。//java实现public class Solution { public String replaceSpace(StringBuffer str) { if (str.length() == ...原创 2017-10-14 23:22:47 · 161 阅读 · 0 评论 -
剑13—调整数组使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。```//方法一:简单易懂,以空间换时间,复杂度o(n)#include<iostream>#include<vector>using namespace std;clas...原创 2017-10-21 22:55:48 · 169 阅读 · 0 评论 -
剑22-从上到下打印二叉树结点(按层遍历)
题目描述 从上往下打印出二叉树的每个节点,同层节点从左至右打印。 思路: 1、引入一个数据容器即队列deque STL实现了一个很好的deque(两端都可以进出的队列) 2、每次打印一个结点的时候,如果该节点有子节点,则把该子节点放到一个队列的末尾。/*struct TreeNode{int val;struct TreeNode*left;struct TreeNode...原创 2017-10-29 22:47:19 · 233 阅读 · 0 评论 -
剑12—数值的整数次方
题目描述 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 思想: 1、指数为负数,对指数求绝对值,计算次方结果之后取倒数 2、取倒数时,考虑到对0取倒数?针对底数base为零,且指数exponent是负数情况特殊处理 3、采用全局变量标识这种错误情况;有返回值、全局变量、异常三种错误处理方式 4、在判断底数base是不是等...原创 2017-10-20 22:55:45 · 150 阅读 · 0 评论 -
剑23-判断是否为二叉树后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思想:递归class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { int length = sequen...原创 2017-10-28 21:49:49 · 381 阅读 · 0 评论 -
剑03-—链表从尾到头打印 || 剑04—重建二叉树(已知前序+中序)
剑03-—链表从尾到头打印题目描述 输入一个链表,从尾到头打印链表每个节点的值。 思想: (方法1)栈的思想:从头到尾遍历链表,从尾到头输出,后进先出 (方法2)递归实现import java.util.Stack;import java.util.ArrayList;/*//栈思想:先进后出public class Solution { public Ar...原创 2017-10-16 10:09:27 · 167 阅读 · 0 评论 -
剑7-10 —斐波纳契数列
题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n<=39思想:f(n)=f(n-1)+f(n-2)从下往上计算,首先根据f(0)和f(1)计算出f(2),再依次计算出f(3),…..f(n).这种方法的时间复杂度是o(n)class Solution{public: int Fibonacci(int n) { ...原创 2017-10-20 09:21:03 · 288 阅读 · 0 评论 -
剑21-判断序列是否为该栈的弹出顺序
题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)class Solution {public: bool IsPopOr...原创 2017-10-27 11:10:07 · 225 阅读 · 0 评论 -
剑6—旋转数组的最小数字
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 思路:二分查找方法 1、定义int index1,indexMid,index2 2、比较rotate...原创 2017-10-19 09:22:44 · 154 阅读 · 0 评论 -
剑15—反转链表
16反转链表 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。 思路: 1、考虑特殊情况,如空链表 2、定义三个指针分别指向当前结点,前一个结点,后一个结点,且当当前结点不为空时,才后一个结点 3、如果后一个结点为空时,即到达尾结点,即当前结点为反转后链表的头结点 4、否则不为空,则将当前结点指向前一个结点,进行链表反转 5、同时,当前结点和后一个结点断...原创 2017-10-24 09:38:06 · 155 阅读 · 0 评论 -
剑14—输出链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点。 思想: n,n-1,………,k+1, k, k-1,……3,2,1 倒数第k个结点; 前面需要走n-k+1; 定义两个指针p1,p2,开始均指向首节点,先让p1移动到指向第k个节点,然后p1,p2同时移动,p1移动到第n个结点时,刚好移动了n-k+1,此时p2也移动n-k+1,则此时p2刚好指向倒数第k个结点。/*stru...原创 2017-10-22 21:56:06 · 328 阅读 · 0 评论 -
剑36—两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。 解题思想:设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,可知 a + c + b = b + c + a。当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部重新开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部重新开始访问链表 A。这样就...原创 2018-04-12 17:42:47 · 117 阅读 · 0 评论 -
剑35—数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字数据范围:对于%50的数据,size<=10^4对于%75的数据,size<=10^5对于%100的数据...原创 2018-04-12 17:31:28 · 124 阅读 · 0 评论 -
剑28—数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。方法一:(剑指思想)采用阵地攻守的思想:时间复杂度是O(n)1)第一个数字作为第一个士兵,守阵地;count = 1; 2)遇到相同元素,count++; 遇...原创 2018-04-03 21:33:40 · 116 阅读 · 0 评论