![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
Chan_Keh
https://github.com/chankeh
展开
-
数组中两个只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。方法1://二话不说,直接哈希class Solution {public: void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) { sort(data.begin(),data.end());原创 2017-09-02 21:14:06 · 355 阅读 · 0 评论 -
一个无序自然数序列有N个自然数,快速找到二者之和为M的两个整数并输出
思路:首先对无序自然数数列进行排序(升序),然后定义i和j分别指向数列的两端,所指两数之和分别和M作比较,比M大,则j左移,比M小,则i右移。#include <stdio.h>#include <stdlib.h>//快排void sort(int *a, int left, int right){ if(left >= right) { return ;原创 2017-08-14 20:52:09 · 1090 阅读 · 0 评论 -
二维数组中的查找
剑指offer第一题,很简单,暴力的话oj也没有超时,如果使用二分查找效果更好 题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。class Solution {public: bool Find(int target, vector<vector<int>原创 2017-08-13 21:52:35 · 169 阅读 · 0 评论 -
替换空格
虽然题目简单,但是为了好好整理博客,还是写到这里吧 问题描述: 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。class Solution {public:void replaceSpace(char *str, int length) { int cnt_sp = 0原创 2017-08-13 21:49:21 · 180 阅读 · 0 评论 -
重建二叉树
给定两个序列,根据前序和中序构造二叉树: 例如前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod原创 2017-08-13 21:41:03 · 153 阅读 · 1 评论 -
将无序的数组转换成堆
给出一个整数数组,堆化操作就是把它变成一个最小堆数组。对于堆数组A,A[0]是堆的根,并对于每个A[i],A [i * 2 + 1]是A[i]的左儿子并且A[i * 2 + 2]是A[i]的右儿子。样例 给出 [3,2,1,4,5],返回[1,2,3,4,5] 或者任何一个合法的堆数组挑战 O(n)的时间复杂度完成堆化说明 什么是堆?堆是一种数据结构,它通常有三种方法:push, pop 和原创 2017-08-13 10:14:10 · 4473 阅读 · 1 评论 -
二叉树的镜像
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10原创 2017-08-18 22:42:08 · 153 阅读 · 0 评论 -
树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)class Solution {public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { if(pRoot2 == NULL || pRoot1 == NULL ) return fals原创 2017-08-18 22:34:50 · 240 阅读 · 0 评论 -
翻转单链表
/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) {原创 2017-08-17 22:27:15 · 171 阅读 · 0 评论 -
变态跳台阶
题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。关于本题,前提是n个台阶会有一次n阶的跳法。分析如下: f(1) = 1 f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。 f(3) = f(3-1) + f(3-2) + f(3-3) …原创 2017-08-16 21:04:33 · 165 阅读 · 0 评论 -
二叉搜索树的第K个节点
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution { int count =原创 2017-07-06 21:34:10 · 249 阅读 · 0 评论 -
按之字形顺序打印二叉树
/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*///仍然是层序遍历的思想进行改进class Solution原创 2017-07-06 16:38:10 · 185 阅读 · 0 评论 -
链表中环的入口节点
//一个链表中包含环,请找出该链表的环的入口结点。class Solution {public: ListNode* EntryNodeOfLoop(ListNode* pHead) { ListNode *slow = pHead; ListNode *fast = pHead; do{ if(fast原创 2017-06-27 22:06:08 · 238 阅读 · 0 评论 -
重建二叉树
class Solution {public: struct TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) { return rebulidBinaryTree(pre, in); } static TreeNode* rebulidBinaryTree(vector<int>原创 2017-06-14 23:56:46 · 192 阅读 · 0 评论 -
把字符串转换成整数
//这一题其实不难,主要是需要考虑的因素太多,要想一次性写对还是需要很全面的逻辑#include <iostream>#include <string>using namespace std;int convert(string str){ int n = str.length(); if((n<1||n==1&&str[0]=='-')||((n<1||n==1&&str原创 2017-06-27 13:01:12 · 273 阅读 · 0 评论 -
翻转单词顺序
#include <iostream>#include <string.h>using namespace std;void reverse_word(char *pBegin, char *pEnd){ if (pBegin == NULL || pEnd == NULL) return; while (pBegin<pEnd) { s原创 2017-07-05 21:07:59 · 207 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。解析: //左子树一定比右子树小,因此去掉根后,数字分为left,right两部分,right部分的 //最后一个数字是右子树的根他也比左子树所有值大,因此我们可以每次只看有子树是否符合条件 //即可,即使到达了左子树左子树也可以看出由左右子树组原创 2017-08-24 22:37:14 · 203 阅读 · 0 评论 -
和为S的两个数字
题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。 输出描述: 对应每个测试案例,输出两个数,小的先输出。数列满足递增,设两个头尾两个指针i和j, 若ai + aj == sum,就是答案(相差越远乘积越小) 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j原创 2017-09-04 00:12:08 · 250 阅读 · 0 评论 -
二叉树中和为某一值的路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x),原创 2017-08-25 17:00:12 · 252 阅读 · 0 评论 -
平衡二叉树
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(!pRoot) return true; if(!pRoot->left&&!pRoot->right)原创 2017-09-02 19:45:38 · 312 阅读 · 0 评论 -
数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述: 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%1原创 2017-09-01 10:34:57 · 340 阅读 · 0 评论 -
把数组排成最小的数
题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 class Solution { public: static bool judge(int a,int b) { string A = ""; string B原创 2017-08-31 12:19:40 · 219 阅读 · 0 评论 -
连续子数组的最大和
经典动态规划HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度原创 2017-08-29 23:50:28 · 248 阅读 · 0 评论 -
数组中重复的数字
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。第一种方法, 哈希:class Solution {public: bool duplicate(int numbers[],原创 2017-09-07 10:51:26 · 334 阅读 · 0 评论 -
翻转单词顺序列
题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?class Solutio原创 2017-09-06 21:02:59 · 254 阅读 · 0 评论 -
左旋转字符串
题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!class Solution {public: string LeftRotateStri原创 2017-09-06 20:28:13 · 282 阅读 · 0 评论 -
和为S的连续正数序列
题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 输出描述: 输出所有和为S的连续正数序列原创 2017-09-06 18:57:01 · 302 阅读 · 0 评论 -
数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。//其实这个题目很简单,直接排一次序,然后计算中位数的个数,如果中位数个数大于总数//的1/2,那么就返回mid,否则返回0class Solution {public: int原创 2017-08-29 00:24:39 · 360 阅读 · 0 评论 -
字符串的全排列
#include <iostream>using namespace std;void permutation(char* str,char *start){ if(*start=='\0') cout<<str<<endl; else { for(char* pchar = start;*pchar!='\0';++pchar)原创 2017-06-22 23:47:18 · 246 阅读 · 0 评论 -
从上往下打印二叉树
void print_from_top2bottom(BinaryTree *pRoot){ if(!pRoot) return ; std::deque<BinaryTree*> dequetree; dequetree.push_back(pRoot); while(dequetree.size()) { BinaryTre原创 2017-06-22 16:48:14 · 177 阅读 · 0 评论 -
栈的压入弹出序列
#include "stdafx.h" #include <iostream> #include <stack> using namespace std; bool IsPopOrder(int *pPush, int *pPop, int nLength) { if (pPush == NULL || pPop == NULL || nLength <= 0)原创 2017-06-22 16:07:09 · 263 阅读 · 0 评论 -
二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。//这个问题往中序遍历比较好想,先用递归的中序遍历将遍历的节点存放到vector中//然后,遍历vector元素两次,将它改成双向链表/*struct TreeNode { int val; struct TreeNode *left; struct Tre原创 2017-08-27 21:58:57 · 175 阅读 · 0 评论 -
复杂链表的复制
题目描述 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)//这个问题如果不用递归来做会很麻烦,所以为了简便,直接递归/*struct RandomListNode { int label; struct Rand原创 2017-08-27 20:13:03 · 295 阅读 · 0 评论 -
跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 | 1, (n=1) f(n) = | 2, (n=2) | f(n-1)+f(n-2) ,(n>2,n为整数)class Solution {public: int jumpFloor(int number) {原创 2017-08-15 22:10:34 · 137 阅读 · 0 评论 -
数组中只出现一次的数字
//典型亦或运算,这里直接上code,不解释#include <iostream>using namespace std;int only(int a[],int n){ int tmp = a[0]; int i = 1; while(i<n) { tmp^=a[i]; ++i; } return tmp;}原创 2017-06-26 23:15:16 · 155 阅读 · 0 评论 -
二叉树的深度
class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int l = TreeDepth(pRoot->left); int r = TreeDepth(pRoot->right); return l原创 2017-06-26 23:02:02 · 197 阅读 · 0 评论 -
顺时针打印矩阵
#include <iostream>#include <vector>using namespace std;void print_circle(vector<vector<int> >arr,int cols,int rows,int start);void print_wisely(vector<vector<int> >arr,int cols,int rows);int main(原创 2017-06-21 22:35:35 · 216 阅读 · 0 评论 -
求1+2+...+n
//要求不能用乘除法,不能用循环,等关键字以及不能用问号表达式//所以,,这里的思路最好想到的就是递归了#include <iostream>using namespace std;int sum(int n){ if(n<=1) return n; else return n+sum(n-1);}int main(){ int n;原创 2017-06-30 20:52:11 · 548 阅读 · 0 评论 -
二叉树的镜像
//这里仅写部分代码了class BiTree{ int val; BiTree left; BiTree right;};//二叉树结构定义void mirro(BiTree T){ if(T==NULL) return NULL; if(T->left==NULL&&T->right==NULL) return ;原创 2017-06-20 22:01:34 · 139 阅读 · 0 评论 -
二叉树的子结构
#include<iostream>#include<stack>#include<queue>using namespace std;//二叉树结点typedef struct BiTNode{ //数据 char data; //左右孩子指针 struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;//按先序序列创原创 2017-06-20 21:46:22 · 240 阅读 · 0 评论