32.把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 解题思路 下面的思路来自《剑指offer》 其实本质上还是排序算法,只不过排序的时候比大小的方式
33.丑数 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 解题思路 下面的思路来自《剑指offer》。 首先找丑数的规律,质数就是除了1和它本身以外没有其他的因子,丑
34.第一个只出现一次的字符 题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)。 解题思路 下面的思路来自《剑指offer》。 思路一,笨办法。遍历每个字符,每个字符都和所有的字符对比。 思路二
35.数组中的逆序对 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字。 数据范围: 对于%50的
36.两个链表的第一个公共结点 题目描述 输入两个链表,找出它们的第一个公共结点。 解题思路 下面的思路来自《剑指offer》。 如果两个链表有公共结点,那么从这个公共结点开始,以下的全都是一样的。 思路一,利用两个栈,从两个链表的底部开始对比。先将两个链表的所有结点依次入栈,然后从链尾开始对比,直到两个结点地
37.数字在排序数组中出现的次数 题目描述 统计一个数字在排序数组中出现的次数。 解题思路 下面的思路来自《剑指offer》。 思路一,从头到尾遍历统计,复杂度$O(n)$。 思路二,折半查找,前后统计。既然是排序的数组,那就比较好办了,只需要找到这个数的位置,然后向前和向后统计一下数量就行,复杂度$O(n)$
38.二叉树的深度 题目描述 输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 解题思路 下面的思路来自《剑指offer》。 思路一,递归遍历所有路径,类似于《24.二叉树中和为某一值的路径》的方法。可以创建一个全局变量用于保存当前最长路
39.平衡二叉树 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路 平衡二叉树:平衡二叉树(Balanced Binary Tree)具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树 、AVL 、替罪羊树 、Treap 、
40.数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解题思路 下面的思路来自《剑指offer》。 将问题转化为只有一个数字只出现了一次。首先考虑数组中只有一个数字只出现了一次,只需要将数组中每个数字进行异或,最后得到的数字就是那
41.和为S的连续正数序列 题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问