![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
汪小哥
有多少时光可以挥洒~人生短短几十年~
展开
-
码农小汪剑指Offer之42-翻转单词顺序列
题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解题思路这道题我被坑了一会~估原创 2016-04-23 15:12:25 · 787 阅读 · 0 评论 -
码农小汪-剑指Offer之30 -把数组排成最小的数(拼接字符串排序)
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。解题思路本题的意思不就是把我们的字符串连接在一起嘛,比较大小。拼接排序就行了。 2 13 132 213 比较排序就知道了,拼接后的什么样的顺序在一起。多个也是一样的啊。两两比较的结果放在一起的嘛,怎么会不原创 2016-03-31 23:15:03 · 900 阅读 · 0 评论 -
码农小汪-剑指Offer之29 -整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。解题思路1。我们可以突破常规,把数字看做为字符,比较字符中出现的1的个数 2。这个和上面的思路一样的,和我们的原创 2016-03-31 22:35:45 · 436 阅读 · 0 评论 -
码农小汪-剑指Offer之27 -连续子数组的最大和
动态规划http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如原创 2016-03-31 22:18:14 · 477 阅读 · 0 评论 -
码农小汪-剑指Offer之27 -最小的K个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解题思路1。先排序 2。找到就好了,利用容器很好实现这个功能 纯暴力解决 略坑的地方是,K比数组大的时候输出为[]package JianzhiOffer;import java.util.ArrayList;import java.util.Collection原创 2016-03-31 21:45:03 · 470 阅读 · 0 评论 -
码农小汪-剑指Offer之26 -数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。解题思路我们寻找的目的就是对应一个数字与之对应的次数就行了。明显的hashMap这个是必须的吧。package JianzhiOffer;import java.util.HashMa原创 2016-03-31 21:29:14 · 480 阅读 · 0 评论 -
码农小汪-剑指Offer之25 -字符串的排列(全排列)
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。其实就是一个全排序,可能有重复的字母,需要不有重复的容器,我选择了hashset这个容器,应为我们的容器之间可以相原创 2016-03-31 20:54:56 · 569 阅读 · 0 评论 -
码农小汪-剑指Offer之24 -二叉搜索树与双向链表
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。解读题目的意思就是通过左右好比我们的双向链表的前后进行转换后变成啦,那种可以前后的链表的感觉!若采用中序遍历,其遍历顺序为1-2-3-4-5-6-7,通过适当的指针变换操作,可变成的双向有序链表如下:变成什么样子呢? 我的做法比较的暴力,但是思路很清晰,大家都看的懂!不用在遍历原创 2016-03-31 19:37:43 · 526 阅读 · 0 评论 -
码农小汪-剑指Offer之23 -复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)题解这个题目和我们一般的链表的复制没得啥子不一样的,最后返回我们的头结点就行了。代码package JianzhiOffer;class RandomListNode { int label; RandomListNode next = null; RandomL原创 2016-03-31 11:09:01 · 481 阅读 · 0 评论 -
码农小汪-剑指Offer之31 -丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。解题思路如下:因子中仅仅包含2、3、5的数,称为丑数。比如说14,就不是丑数,因为因子包含7。 请输出所有丑数中的第n个丑数。 第一个是基本的思路。写一个函数判断一个数字n是不是丑数。 那么可能会这么写:sta原创 2016-04-01 18:37:04 · 792 阅读 · 0 评论 -
码农小汪-剑指Offer之32 -第一个只出现一次的字符位置
题目描述在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符的位置。若为空串,返回-1。位置索引从0开始解题思路我的想法就是,利用Map保存出现的次数,key就是我们的字符串,value就是我们的次数。出现的顺序问题上,我弄错了,好久都没想清楚这个问题,其实还有种方法,保证我们插入的顺序有序的LinkHashMap. 我在用一个Map标记第一次出现时的位置。这原创 2016-04-02 00:42:36 · 473 阅读 · 0 评论 -
码农小汪-剑指Offer之33 -数组中的逆序对 冒泡排序 归并排序
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路我一看到这道题,首先就想到了冒泡排序,总是两两比较然后统计次数!public class Sloution33 { /** * 冒泡解决问题 * @param array * @return */ publ原创 2016-04-04 23:49:42 · 613 阅读 · 0 评论 -
码农小汪剑指Offer之41-左旋转字符串
左旋转字符串汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解题思路首先,我们需要排除一些特殊的情况比如字符串为空,之内的,返回“”; 还有个特殊的地方,我们原创 2016-04-23 14:40:08 · 538 阅读 · 0 评论 -
码农小汪剑指Offer之40-和为S的两个数字(有序数组) 左右夹逼
和为S的两个数字题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。解题思路这个是有序的数列,有序的东西,首先的第一步估计就是怎么去利用好这个东西吧,比如我们的二分搜索。之内的!还有个问题,如果有多对,输出乘积为最小的,这里我是有点蒙啦。但是一旦想到了,利原创 2016-04-23 14:13:28 · 955 阅读 · 0 评论 -
码农小汪剑指Offer之39-和为S的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:输出所有和为S的连续正数序列。序列内按原创 2016-04-23 13:39:15 · 511 阅读 · 0 评论 -
码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。解题思路这道题,看上去没啥的,其实真实的很难,如果你从未接触过,一般情况下多数都是无法搞定这个问题的,不好解决!如果可以使用HashMap那么还需要你来解决?这道题考的是异或运算,而且增加了难度! 从题目可以知道,其他的数字都是有两个的,对吧!只有其中的两个数字不一样!两个数字不一样的话,异或肯定存原创 2016-04-09 23:02:51 · 666 阅读 · 0 评论 -
码农小汪剑指Offer之37-平衡二叉树判定
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。解题思路求解二叉树的高度,比较就知道了package JianzhiOffer;public class Sloution37 { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) { return true;原创 2016-04-05 23:41:10 · 572 阅读 · 0 评论 -
码农小汪剑指Offer之36-二叉树的深度 层次遍历 分而冶之
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解题思路我已看到这个题目的时候,就想到了利用分冶的方法,利用递归的思路。我们只要找到出口,分了之后就要合并啊。和我们的归并排序有点意思哦,昨天晚上做的那个类似的思路。 当前结点的Length=max(left,right)+1; 这个就是我的解题思路!其实还有思路。比如原创 2016-04-05 17:02:37 · 627 阅读 · 0 评论 -
码农小汪剑指Offer之35-数字在排序数组中出现的次数 暴力 二分查找的运用
题目描述统计一个数字在排序数组中出现的次数。解题思路我们看一下题目中的关键字,第一个排序数组,已经排好序了,当然不能忽略这个问题。排好序在做的算法,一想肯定二分搜索这个东西,必须的想得到涩。我们寻找数字,又是排好序的。其实一般来说的,暴力解决这个问题,就没得艺术性可以说啦,简直没必要涩。使用二分是个比较好的选择!因为这里涉及到了统计次数。找到其中的一个。肯定在其前面或者后面还有,就像寻找就行了。注意原创 2016-04-05 16:25:56 · 670 阅读 · 0 评论 -
码农小汪-剑指Offer之34 -两个链表的第一个公共结点 hashMap
题目描述输入两个链表,找出它们的第一个公共结点。解题思路如下:我解题的思路: 1. 利用Map保存每个节点的值,和对应的ListNode。先遍历我们的第一个链表,然后再让第二个链表在map中去寻找值,是否能寻找得到呢?package JianzhiOffer;import java.util.HashMap;import java.util.Map;class ListNode {原创 2016-04-05 15:59:33 · 508 阅读 · 0 评论 -
码农小汪-剑指Offer之1- 跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级;求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路如下:其实这个是一个递归的过程,我们可以通过划分为小的部分求解。 n=1 1 n=2 2 n=3 2+1 n=4 ….. f[n]=f[n-1]+f[n-2];所以我们就可以解决问题了。package JianzhiOffer; /** * 一只青蛙原创 2016-03-30 23:27:36 · 457 阅读 · 0 评论 -
码农小汪-剑指Offer之22-二叉树中和为某一值的路径
题目描述输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 说实话,刚开始真的没有理解这个道理是啥子意思来着,我来讲个通俗易懂的吧!我们从根一直访问到我们的叶子。每个节点加起来的值为我们输入整数的值。另一种说法就是。求解所有到叶子节点的值得和,并打印出所有的路径,这里增加了一些其他的要求!解题思路这种问题来说原创 2016-03-30 23:22:47 · 560 阅读 · 0 评论 -
码农小汪-剑指Offer之4- 在二维数组中查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解题思路: 矩阵是有序的,从左下角来看,向上数字递减,向右数字递增, 因此从左下角开始查找,当要查找数字比左下角数字大时。右移 要查找数字比左下角数字小时,上移 。 恰好,我们的左下角就在我们的整个数组中的岔路口中原创 2016-03-30 23:35:46 · 524 阅读 · 0 评论 -
码农小汪-剑指Offer之3- 矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?题目解决问题package JianzhiOffer; /** * 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。 * 请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? * @author JetWang *原创 2016-03-30 23:33:07 · 505 阅读 · 0 评论 -
码农小汪-剑指Offer之2- 变态跳台阶
之前写在印象笔记的复制过来题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题解:用Fiber(n)表示青蛙跳上n级台阶的跳法数, 青蛙一次性跳上n个台阶的跳法数为1,Fib(0)=1; 当n=1,一种跳法Fib(1-1)=1; 当n=2,Fiber(2)=Fiber(2-1)+Fiber(2-2); 当n=3,Fibe原创 2016-03-30 23:31:23 · 575 阅读 · 0 评论 -
码农小汪-剑指Offer之20-从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。题解其实就是我们的数据结构中的层次遍历,晓得就好做了,Java中的Queue是个借口,我们找他的实现类去玩。 代码就是个层次遍历okpackage JianzhiOffer;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;/原创 2016-03-30 21:29:43 · 456 阅读 · 0 评论 -
码农小汪-剑指Offer之19-栈的压入、弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解题思路其实这个问题很明显的,我们都知道怎么解决,方式不一样而已。 我说话我的大概怎么理解这个问题的: 我压进去一个,比较是否原创 2016-03-30 21:05:12 · 404 阅读 · 0 评论 -
码农小汪-剑指Offer之18-包含min函数的栈
题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 如下我们可以看出来,我们必须的还有原来的行为。public void push(int node) { } public void pop() { } public int top() { } public int min() { }题解我们的保持原来的行为,栈以前能做的事情,原创 2016-03-30 20:06:55 · 464 阅读 · 0 评论 -
码农小汪-剑指Offer之17-顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字 例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字 1, 2, 3, 4, 8,1 2, 16, 15, 14, 13 ,9, 5, 6, 7, 11 ,10. 题解:这道题还是比较的难,个人觉得,考虑必须必须周原创 2016-03-30 19:45:26 · 453 阅读 · 0 评论 -
码农小汪-剑指Offer之16-二叉树的镜像
题目描素操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6原创 2016-03-30 18:49:44 · 438 阅读 · 0 评论 -
码农小汪-剑指Offer之5 -替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。解题思路:我们使用一个空的字符串作为最后的结果,增加了空间,每次只要是空格就增加进入,不是空格把文字加入,从新的构建我们的字符串package JianzhiOffer;public class Sloution5 { public原创 2016-03-30 23:38:23 · 512 阅读 · 0 评论 -
码农小汪-剑指Offer之6 - 打印链表格
题目描述输入一个链表,从尾到头打印链表每个节点的值。 error1: 表头不为空,可以带着值得 error2: 和上面的类似,判读为空的情况解决方案:我们只是知道了我们的表头的节点,我们先把结果放入我们的Stack中,然后再去使用数组打印回来!这样就解决问题的所在了package JianzhiOffer;import java.util.ArrayList;import java.ut原创 2016-03-31 09:52:09 · 505 阅读 · 0 评论 -
码农小汪-剑指Offer之7 - 重建二叉树(根据前序遍历中序遍历求二叉树)
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 根左右(前序) 中序左根右 肯定有相同的地方值得考虑。通过递归的思路解决问题解题思路:1.先求出根节点(前序序列第一个元素)。 2.将根节点带入到中序遍原创 2016-03-31 10:04:09 · 583 阅读 · 0 评论 -
码农小汪-剑指Offer之21-二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题解首先我们得知道后序遍历的特点,我们的遍历后的字串被分为了三部分,左右根,此题中的二叉搜素树是一个有循序的,很有规律。左边的比右边的大。知道这个之后呢。我们肯定要用递归遍历这个字符串,分成几部分进行不断的缩小处理。直到我们可以处理为止。有点像归并排序的特原创 2016-03-30 22:08:31 · 498 阅读 · 0 评论 -
码农小汪-剑指Offer之14 -合并两个排序的链表
题目描述输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。解题思路:我们可以直接按照题目的要求进行解题。但是要注意特殊的情况 List 为空 list2 为空 ! 注意保留头结点,和指针节点的处理代码package JianzhiOffer;/* * 输入两个单调递增的链表, * 输出两个链表合成后的链表, * 当然我们需要合成后的链表满足 *原创 2016-03-31 10:33:23 · 439 阅读 · 0 评论 -
码农小汪-剑指Offer之13 -反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路:从新成一个链表,不断的向头结点插入! 1.只需要头结点就可以搞定啦(这种比较爽) 2.一个头指针,一个尾指针代码package JianzhiOffer;public class Slution13 { /** * 解决思路,一步步的从以前的插入到现在的头部! * @param head *原创 2016-03-31 10:29:38 · 454 阅读 · 0 评论 -
码农小汪-剑指Offer之12 -链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路:由于我们的只知到表头节点,不知道链表的长度,所以我们要做出一些处理才行,需要知道表的长度! 第二通过表的长度,求出倒数第K点位于我们的链表的什么地方! length -k+1;代码package JianzhiOffer;/** * * @author JetWang * */public class Slution12 {原创 2016-03-31 10:24:58 · 438 阅读 · 0 评论 -
码农小汪-剑指Offer之11 - 调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路:主要是解决他们的相对位置的问题,我遍历一遍分别保存到不同的容器中,最后合并在一起就行了!代码package JianzhiOffer;import java.util.ArrayList;/** * * @原创 2016-03-31 10:21:44 · 430 阅读 · 0 评论 -
码农小汪-剑指Offer之10 - 数值的整数次方 快速幂
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。题解:对于浮点数的指数处理,首先想到,暴力处理! 注意我指数的正负的结果,对于我们的后来的过程是有影响的! 1./result 为负数的时候,正的直接就是result; 分而治之的手段,想到了快速幂的处理思路,减少了我们乘法的次数,提高了效率代码package Jianzhi原创 2016-03-31 10:18:57 · 684 阅读 · 0 评论 -
码农小汪-剑指Offer之9 - 二进制中1的个数 算数右移 逻辑左移
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路:刚开始想法是,不断的进行右移进行与1与运算的话,我们的题目就可以解决了这个问题! 但是我们的负数的时候,进行右移位算术右移,不断的补1 这样会造成我们的判断错误!进行我们的左移动的话不用考虑这些问题,我们不移动我们原来的数字,反之移动我们的比较的数字向左移动,这样比较简单的解决了问题左移这种事情特别的快,通过我们原创 2016-03-31 10:14:34 · 634 阅读 · 0 评论