
剑指offer
szl_lxy
此博客希望可以作为我俩成长的见证者,增强我们的表达能力,也希望可以帮助一同成长进步的人
展开
-
扑克牌顺子
题目:从扑克牌中随机抽取五张牌,判断是不是一个顺子。即这五张牌是不是连续的。2-10为数字本身A为1,J为11,Q为12,K为13,而大小王可以看成任意数字#include using namespace std;int comp(const void *arg1, const void *arg2){ return *(int*)arg1 - *(int*)arg2;}bool原创 2015-09-08 10:48:21 · 324 阅读 · 0 评论 -
赋值构造函数
#include #include using namespace std;class CMyString{public: CMyString(char *pdata = NULL); CMyString(const CMyString& str); ~CMyString(); CMyString& operator = (const CMyString& str); v原创 2015-08-19 15:32:56 · 339 阅读 · 0 评论 -
数组中的逆序对
题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。#include using namespace std;int InverPairCore (int* data,int* copy, int start, int end){ if(start == end) { copy[start原创 2015-09-03 20:04:35 · 283 阅读 · 0 评论 -
第一个只出现一次的字符
题目描述在一个字符串(1#include using namespace std;char FirstNoRepeatingChar(char* pString){ if(pString == NULL) return '\0'; const int tableSize = 256; unsigned int HashTable[tableSize]; for(i原创 2015-09-03 19:01:07 · 309 阅读 · 0 评论 -
数组组成最小数字
题目描述输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。#include using namespace std;int NumberMaxLength = 10;char* combine1 = new char[NumberMaxLength*2原创 2015-09-02 17:34:19 · 795 阅读 · 0 评论 -
两个链表的第一个公共结点
题目描述输入两个链表,找出它们的第一个公共结点。#include #include "List.h"using namespace std;int GetLength(ListNode* pHead){ int count = 0; ListNode* pNode = pHead; while(pNode != NULL) { count++; pNode原创 2015-09-03 20:50:38 · 279 阅读 · 0 评论 -
丑数
题目描述把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。#include using namespace std;int Min(int num1, int num2, int num3){ int min = (num1 < num2) ? n原创 2015-09-02 21:40:26 · 266 阅读 · 0 评论 -
圆圈中最后剩下的数
题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数。求出这个圆圈里剩下的最后一个数字。#include #include using namespace std;int LastRemain(int n ,int m){ if(n < 1 || m < 1) return -1; list number; for(int i =原创 2015-09-08 11:35:24 · 402 阅读 · 0 评论 -
最小的k个数
题目描述输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。(适用于n很大,k很小的情况#include #include #include using namespace std;typedef multiset > intSet;typedef multiset >::iterator intIter;原创 2015-09-02 11:56:48 · 307 阅读 · 0 评论 -
数组中出现次数超过一半的数字
题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。#include using namespace std;bool Check(int* number,int result,int length){ int times =原创 2015-09-01 13:56:21 · 290 阅读 · 0 评论 -
整数中1出现的次数(从1到n整数中1出现的次数)
题目描述求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。#include using namespace std;int Power10Base(原创 2015-09-02 16:31:03 · 277 阅读 · 0 评论 -
八皇后问题
1、介绍先上张图来说明用回溯法解八皇后问题的每一步: 2、程序看着严蔚敏的书写的,写好后运行一次性成功了,程序如下:[cpp] view plaincopyprint?// N皇后问题 #include using namespace std; #de转载 2015-09-01 11:20:17 · 311 阅读 · 0 评论 -
[收集]字符串的全排列和组合
今天学习了一下何海涛博客中的第28题,字符串的排列问题,实际上指的是字符串的全排列问题(排列和全排列还是有区别的吧)。思考并研究了这题之后就考虑了一下不同条件下其他类似的题的解法的编写,两部分来自于何海涛,其他来自于网络,此处做搬运和收集工作。分别从四个方面考虑:一、字符串的全排列(1)若不考虑字符串中有重复字符(即假设字符串中无重复字符)(2)若考虑字符串中有重复字符(即假设字符串中有重转载 2015-09-01 11:17:36 · 382 阅读 · 0 评论 -
字符串的排列
题目描述输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 输入描述:输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。#include using namespace std;void Permutation(char*原创 2015-09-01 11:01:43 · 289 阅读 · 0 评论 -
连续子数组的最大和
题目描述HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?原创 2015-09-02 15:24:31 · 289 阅读 · 0 评论 -
数字在排序数组中出现的次数
题目描述统计一个数字在排序数组中出现的次数。#include using namespace std;int GetFirstOfK(int* arr,int k, int start, int end){ if(start > end) return -1; int MiddIndex = (start + end) / 2; int Middata = arr原创 2015-09-04 15:49:26 · 246 阅读 · 0 评论 -
二叉树的深度
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。#include #include "BinaryTree.h"using namespace std;int TreeDepth(BinaryTreeNode* pRoot){ if(pRoot == NULL) return 0; i原创 2015-09-04 16:08:42 · 266 阅读 · 0 评论 -
把字符串转换成整数
bool g_Invalid = true;long long strToIntCore(const char* str, bool minus){ long long num = 0; while(*str != '\0') { if(*str >= '0' && *str <= '9') { int flag = minus ? -1 : 1; num = num原创 2015-09-08 15:04:28 · 340 阅读 · 0 评论 -
斐波那契数列(青蛙跳台阶)
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。#includeusing namespace std;long long fibonacci(unsigned int n){ if(n < 2) return n; long long fibNminus1 = 0; long long fibNminus2 = 1;原创 2015-08-21 17:53:09 · 508 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。#include using namespace std;int midInOrder( int *arr,int low,int high){ int原创 2015-08-21 17:09:33 · 237 阅读 · 0 评论 -
两个桟实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。#include #include using namespace std;template class CQueue{public: CQueue(void); ~CQueue(void); void appendTail(const T &node); T delet原创 2015-08-21 15:33:22 · 300 阅读 · 0 评论 -
n个骰子的点数
把n个骰子扔在地上,所以骰子朝一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率#include #include using namespace std;int g_maxValue = 6;void Probability(int number, int current, int sum, int* Probabilities){ if(current == 1)原创 2015-09-05 15:49:05 · 254 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。#include#include"BinaryTree.h"using namespace std;BinaryTreeNode* C原创 2015-08-20 16:30:32 · 269 阅读 · 0 评论 -
数组中只出现一次的数字
题目描述一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。#include using namespace std;int FindFirst1(int num){ int index = 0; while ((num & 1) == 0 && index < 8 * sizeof(int)) { num = num >>原创 2015-09-04 17:14:10 · 274 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。#include #include #include "List.h"using namespace std;void printList_Interatively(ListNode* pHead){ stack List; ListNode* pNode = pHead; while(pNode != NULL)原创 2015-08-20 11:38:35 · 299 阅读 · 0 评论 -
左旋转字符串
题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!#include using namespace std;void Reverse原创 2015-09-05 14:59:16 · 275 阅读 · 0 评论 -
翻转单词顺序
题目描述JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?#incl原创 2015-09-05 14:35:01 · 357 阅读 · 0 评论 -
和为s的两个数字
题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述:对应每个测试案例,输出两个数,小的先输出。#include using namespace std;bool TwoNumberWithSum(int* data, int length ,int s, int *num1,原创 2015-09-05 13:26:36 · 275 阅读 · 0 评论 -
和为s的连续正数序列
题目描述小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述:输出所有和为S的连续原创 2015-09-05 13:52:05 · 293 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。#include using namespace std;void ReplaceBlank(char str[], int length){ if(str == NULL || length <= 0)原创 2015-08-19 17:23:49 · 272 阅读 · 0 评论 -
二维数组的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。#include using namespace std;bool FindNum(int *matrix, int Rows, int Cols, int num){ bool find = fals原创 2015-08-19 16:22:20 · 258 阅读 · 0 评论 -
平衡二叉树
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。#include #include "BinaryTree.h"using namespace std;bool IsBalanced(BinaryTreeNode* pRoot, int* depth){ if(pRoot == NULL) { *depth = 0; return true; } in原创 2015-09-04 16:30:57 · 275 阅读 · 0 评论 -
复杂链表的复制
题目描述输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。#include #include "ComplexList.h"using namespace std;void CopyNext(ComplexListNode* pHead){ ComplexListNode* pNode = pHead; while原创 2015-08-31 15:20:04 · 282 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。#include using namespace std;bool VerifySquenceOfBST(int sequence[], int length){ if(sequence == NULL && length <=原创 2015-08-31 11:09:47 · 248 阅读 · 0 评论 -
字符流中第一个不重复的字符
#include #include using namespace std;//找出输入流中的第一个只出现一次的字符class CharStatistics{public: CharStatistics(): index(0) { for (int i = 0; i < 256; i++) occurence[i] = -1; } void Insert(cha原创 2015-08-14 13:39:18 · 492 阅读 · 0 评论 -
表示数值的字符串
#include #include using namespace std;void scanDigits(char **string){ while(**string != '\0' && **string >= '0' && **string <= '9') (*string)++;}bool isExponential(char **string){ if(**s原创 2015-08-15 14:56:19 · 308 阅读 · 0 评论 -
栈的压入弹出序列
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。#include #include using namespace std;bool isPopOrder原创 2015-08-28 18:02:08 · 274 阅读 · 0 评论 -
从上往下打印二叉树
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。#include #include #include "BinaryTree.h"using namespace std;void PrintFromTopToBottom(BinaryTreeNode* pRoot ){ if(pRoot == NULL) return; queue Tree_que原创 2015-08-28 20:06:40 · 289 阅读 · 0 评论 -
顺时针打印矩阵
题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.#include using namespace std;void PrintNumber(int num){原创 2015-08-27 18:00:50 · 206 阅读 · 0 评论 -
树的镜像
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述:二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7原创 2015-08-27 16:48:03 · 289 阅读 · 0 评论