随笔分类 -  剑指Offer

摘要:题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。分析:可以利用二路归并排序算法对数组进行排序,并在排序过程中统计逆序对的数目。template void inversePairs ( vector & a, int & ... 阅读全文
posted @ 2015-07-30 10:14 Rosanne 阅读(215) 评论(0) 推荐(0)
摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点的方向。如下图所示:二叉树的结点定义如下:1 struct BinaryTreeNode2 {3 int m_nValue;4 BinaryTreeNode* m_pLeft;... 阅读全文
posted @ 2015-07-09 16:20 Rosanne 阅读(249) 评论(0) 推荐(0)
摘要:题目:请实现ComplexListNode*clone(ComplexListNode*pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中任意一个节点。结点定义如下:1 struct ComplexListNod... 阅读全文
posted @ 2015-07-08 21:04 Rosanne 阅读(931) 评论(1) 推荐(0)
摘要:题目:在字符串中找出第一个只出现一次的字符。如“abaccdeff”,则输出‘b'。解法一:暴力搜索,时间复杂度为O(N2)解法二:利用hash表,时间复杂度为O(N),空间复杂度为O(N) 1 char firstNotRepeatChar(string&str) 2 { 3 if (st... 阅读全文
posted @ 2015-07-08 12:32 Rosanne 阅读(225) 评论(0) 推荐(0)
摘要:题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。 例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前四个数字一次是2、0、4、1,最后剩下的数字为3. 本题是有名的约瑟夫环问题。 阅读全文
posted @ 2015-07-08 11:06 Rosanne 阅读(303) 评论(0) 推荐(0)
摘要:题目:求1+2+...+n,要求不能使用乘除法、for、while、if、else、swithc、case等关键字及条件判断语句(A?B:C)。解法一:利用构造函数求解 1 class Temp 2 { 3 public: 4 Temp() 5 { 6 ... 阅读全文
posted @ 2015-07-07 16:26 Rosanne 阅读(196) 评论(0) 推荐(0)
摘要:题目:从扑克牌中随机抽取5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大王小王可以看成任意数字。分析:我们用0来表示大王和小王。判断5个数字是否是连续的有如下三步:1. 将数组排序2. 统计数组中0的个数3. 统计排序之后的数组中相邻... 阅读全文
posted @ 2015-07-07 16:09 Rosanne 阅读(262) 评论(0) 推荐(0)
摘要:题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串“I am a student.",则输出"student. a am I"。解法一:利用字符串流分割单词1 void reverseWords(string &s) {2 ... 阅读全文
posted @ 2015-07-07 15:23 Rosanne 阅读(206) 评论(0) 推荐(0)
摘要:题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和为s,输出任意一对即可。 1 vector findNumberwWithSum(vector&data, int sum) 2 { 3 int n = data.size(); 4 ... 阅读全文
posted @ 2015-07-07 10:48 Rosanne 阅读(235) 评论(0) 推荐(0)
摘要:题目:一个整形数组里除了两个数字之外,其他的数字都出现了两次。找出这两个只出现一次的数字。要求时间复杂度为O(N),空间复杂度为O(1)。分析:利用异或运算可以求出一个整形数组里唯一一个只出现一次的数字。因此,如果能将本题的数组分成两个部分,使得每个部分只包含一个只出现一次的数字,便可以求得本题的解... 阅读全文
posted @ 2015-07-06 17:29 Rosanne 阅读(216) 评论(0) 推荐(0)
摘要:题目一:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点形成树的一条路径,最长路径的长度为树的深度。二叉树的节点定义如下:struct TreeNode{ int val; TreeNode* left; TreeNode* right;};例如,下图中二... 阅读全文
posted @ 2015-07-06 17:06 Rosanne 阅读(236) 评论(0) 推荐(0)
摘要:题目:统计一个数字在排序数组中出现的次数。解法:二分查找,算法复杂度为O(logN). 1 int getFirstIndexOfK(vector&data, int k) 2 { 3 int n = data.size(); 4 if (n == 0) 5 ret... 阅读全文
posted @ 2015-07-06 16:46 Rosanne 阅读(172) 评论(0) 推荐(0)
摘要:题目:我们把只包含因子2、3和5的数称作丑数。求从小到大的顺序的第1500个丑数。例如6和8是丑数,但14不是。习惯上我们把1当做第一个丑数。解法:创建数组保存已经找到的丑数,用空间换时间创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2、3或者5得到的。 1 int getUg... 阅读全文
posted @ 2015-07-05 20:04 Rosanne 阅读(259) 评论(0) 推荐(0)
摘要:参见LeetCode-Intersection of Two Linked Lists。 阅读全文
posted @ 2015-07-05 16:37 Rosanne 阅读(148) 评论(0) 推荐(0)
摘要:题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.参见LeetCode-Largest Number。 阅读全文
posted @ 2015-07-05 16:17 Rosanne 阅读(211) 评论(0) 推荐(0)
摘要:题目:输入一个整型数组,数组里有正数也有负数。数组中一个或多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(N)。参见LeetCode-Maximum Subarray。 阅读全文
posted @ 2015-07-05 16:09 Rosanne 阅读(144) 评论(0) 推荐(0)
摘要:题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。解法一:O(N)的算法,只有当可以修改输入的数组时可以用参考面试题29“数组中出现次数超过一半的数字”,同样用partition函数来解决这个问题。如果partition函数... 阅读全文
posted @ 2015-07-05 10:38 Rosanne 阅读(274) 评论(0) 推荐(0)
摘要:题目:数组中有一个数字的次数超过数组长度的一半,请找出这个数字。解法一:基于Partition函数的O(N)算法 1 int partition(vector&num, int low, int high) 2 { 3 int pivot = num[low]; 4 while (l... 阅读全文
posted @ 2015-07-04 20:32 Rosanne 阅读(201) 评论(0) 推荐(0)
摘要:题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。参见Leetcode-Path Sum II。 阅读全文
posted @ 2015-07-04 17:41 Rosanne 阅读(160) 评论(0) 推荐(0)
摘要:题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。参见LeetCode-Permutations。本题扩展:如果不是求字符的所有排列,而是求字符的所有组合,应该怎么办?还是输入三... 阅读全文
posted @ 2015-07-03 15:52 Rosanne 阅读(231) 评论(0) 推荐(0)