
剑指offer
阿布哥
这个作者很懒,什么都没留下…
展开
-
面试题26:复杂链表的复制
/*请实现函数ComplexListNode* Clone(ComplexListNode *pHead),复制一个复制链表,在复杂链表中,每个结点除了一个m_pNext指针指向下一个节点外,还有一个m_pSibling指向链表中的任意结点或者NULL*/#include using namespace std;//复杂链表结点定义struct ComplexLinkListN原创 2013-07-29 15:28:08 · 419 阅读 · 0 评论 -
面试题36:数组中的逆序对
/*题目:在数组中的两个数字如果见面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求这个数组中的逆序对的总数*/#include using namespace std;int ReversePairsCore(int data[], int copy[], int start, int end){ //递归出口 if(start =原创 2013-10-15 14:33:37 · 542 阅读 · 0 评论 -
面试题37:两个链表的第一个公共结点
#include using namespace std;//结点定义struct ListNode{ int m_nValue; ListNode *m_pNext;};//创建结点ListNode *CreateListNode(int m){ ListNode *pNode = new ListNode; pNode -原创 2013-10-16 15:41:12 · 584 阅读 · 0 评论 -
面试题38:数字在排序数组中的次数
/*题目:统计一个数字在排序数组中出现的次数,例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4*/#include using namespace std;//运用二分查找找到第一个k出现的位置(数组data是排好序的),不存在返回-1int GetFirstPosOfK(int data[], int length, int原创 2013-10-17 16:01:29 · 446 阅读 · 0 评论 -
面试题39:二叉树的深度
/*题目1:输入一棵二叉树的结点,求该树的深度。从根节点到叶节点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度*//*题目2:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。*/#include using namespace std;//定义一个二叉树结点stru原创 2013-10-18 17:01:54 · 575 阅读 · 0 评论 -
面试题40:数组中只出现一次的数字
/*思路:从头到尾依次异或数组中的每一个数字,最终得到的结果就是两个只出现一次的数字异或的结果。因为其它数字都只出现了两次,在异或中全部抵消了。由于两个数字肯定不一样,那么异或的结果肯定不为0,也就说在这个结果数字的二进制表示中至少有一位为1(即有一位不同)。在结果数字中找到第一个为1的位的位置,记为第n位。然后以第n位是否为1,将数组分为两个子数组,第一个子数组中每个数字的第n位都是原创 2013-10-19 11:14:51 · 685 阅读 · 0 评论 -
面试题42:左旋转字符串
/*题目:定义一个函数实现字符串左旋转操作的功能。字符串的左旋转操作就是把字符串前面的若干个字符转移到字符串的尾部。比如输入字符串"abcdefg"和2,该函数将返回左旋转2位得到的结果"cdefgab"。*/#include #include using namespace std;//翻转字符串void Reverse(char *pStart, char *pEnd)原创 2013-10-21 15:05:56 · 590 阅读 · 0 评论 -
面试题41:和为s的两个数字VS和为s的连续正数序列
/*题目1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。题目2:输入一个正数,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15, 由于1 + 2 + 3 + 4 + 5 =4 + 5 + 6 = 7 + 8 = 15, 所以结果打印出3个连续序列1 ~ 5, 4 ~ 6和7 ~ 8。*/#i原创 2013-10-22 11:48:00 · 549 阅读 · 0 评论 -
面试题34:丑数
package com.abuge;public class GetUglyNum { //得到三个数的最小值 public static int getMin(int num1, int num2, int num3) { int min = (num1 > num2) ? num2 : num1; min = (min > num3) ? num3 : min;原创 2014-09-04 20:05:02 · 633 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
package com.abuge;/** * 面试题35:第一个只出现一次的字符 * 题目:在字符串中找出第一个只出现一次的字符,如输入"abaccdeff",则输出'b' */import java.util.HashMap;public class GetFirstOnceChar { public static char getFirstOnce(String str)原创 2014-09-05 10:05:29 · 600 阅读 · 0 评论 -
面试题35:第一个只出现一次的字符
/*题目:在字符串中找出第一个只出现一次的字符,如输入"abaccdeff",则输出'b'。*/#include using namespace std;//时间复杂度为O(n)空间复杂度为O(1)(利用一个固定大小的数组)char FirstReapeatChar(char *pString){ if(pString == NULL) return '\0原创 2013-10-14 15:47:37 · 619 阅读 · 0 评论 -
面试题34:丑数
/*题目:把只包含因子2、3和5的数称作丑数,求按从小到大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含7.习惯上我们把1当做第一个丑数。*/#include using namespace std;//得到三个数中的最小数int Min(int number1, int number2, int number3){ int min = (n原创 2013-10-12 15:52:40 · 1050 阅读 · 0 评论 -
面试题25:二叉树中和为某一值的路径
/*输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从根的根结点开始往下一直到叶节点所经过的结点形成一条路径。*/#include #include using namespace std;//二叉树结点定义struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft原创 2013-07-30 15:28:07 · 553 阅读 · 0 评论 -
面试题12:打印1到最大的n位数
/* 输入数字n,按顺序打印出1到最大的n位十进制数,比如输入3,则打印出1,2,3一直到最大的3位数是999*//*利用字符串解决大数问题*/#include #include using namespace std;//增量函数bool increment(char *num){ bool IsOverflow = false;//判断是否溢出原创 2013-07-05 17:15:30 · 697 阅读 · 0 评论 -
面试题23:从上往下打印二叉树
/*不管是广度优先遍历一个有向图还是一棵树,都要用到队列,第一步把起始结点(对树而言是根结点)放入到队列中,接下来每一次从队列头部提取出一个结点,遍历这个结点之后把从它能到达的结点(对树而言是子结点)都依次放入到队列,我们重复这个遍历过程,直到队列中的结点全部被遍历为止*//*从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序*/#include #includ原创 2013-07-24 16:41:07 · 539 阅读 · 0 评论 -
面试题24:二叉树的后序遍历序列
/*输入一个整数数组,判断该数组是不是某二叉搜索的后续遍历的结果,如果是返回true,否则返回false,假设输入的数组的任意两个数字互不相同*//*二叉搜索树:若它的左子树不空,则左子树上所有结点的值都小于它的根结点的值,若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左右子树也分别为二叉搜索树*/#include using namespace原创 2013-07-24 16:42:54 · 574 阅读 · 0 评论 -
面试题27:二叉搜索树与双向链表
/*输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表,要求不能创建任何新的结点,只能调整树中结点指针的指向*/#include #include using namespace std;//定义一个二叉树结点struct BinaryTreeNode{ int m_nValue; BinaryTreeNode *m_pLeft;原创 2013-07-31 10:45:48 · 583 阅读 · 0 评论 -
面试题29:数组中出现次数超过一般的数字
/*数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}由于数字2在这个数组中出现了5次,超过数组长度的一半,因此输出2*/#include using namespace std;bool g_InvalidInput = false;//定义一个变量标识输入的有效与否//判断数组是否为有效数组bo原创 2013-08-05 21:34:38 · 561 阅读 · 0 评论 -
面试题28:字符串的排列
/*输入一个字符串,打印出字符串的所有排列,例如输入字符串abc,则打印出a、b、c、所能排列出的所有字符串,abc、acb、bac、cab、cba*/#include using namespace std;//字符串的排列函数void Permuatation(char *pStr, char *pBegin){ if(*pBegin == '\0')原创 2013-08-05 21:36:32 · 487 阅读 · 0 评论 -
面试题31:连续子数组的最大和
/*题目:输入一个整型数组,数组里有正数也有负数,数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。*/#include using namespace std;bool g_InvalidInput = false;int FindGreatestSumofSubarrary(int a[], int n){ //处理原创 2013-09-30 14:45:58 · 761 阅读 · 0 评论 -
最小的k个数
/*输入n个整数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8这8个数字,则最小的四个数字是1,2,3,4*/#include #include #include using namespace std;typedef multiset > intSet;typedef multiset > :: iterator SetIterator;void Ge原创 2013-09-24 21:55:09 · 548 阅读 · 0 评论 -
面试题33:把数组排成最小的数
package com.abuge;/** * 面试题33:把数组排成最小的数 * 输入一个正整数数组,把数组里所有数字拼接成一个数,打印成能拼接出所有数字中最小的一个。 * 例如输入数组{3, 32, 321}则打印三个数字能排成的最小数字 * 思路: * 1、将整型数转换为字符串,可以解决隐形大数问题 * 2、制定比较新规则 */import java.util.Arrays原创 2014-09-04 11:26:13 · 563 阅读 · 0 评论