
剑指offer
奋斗不悔
这个作者很懒,什么都没留下…
展开
-
剑指offer-倒序打印链表
重点提示面试过程中若需要修改输入的数据,可以提前问面试官是否允许做修改;需要考虑程序的鲁棒性(其实就是容不容易崩);原创 2017-04-03 14:24:42 · 324 阅读 · 0 评论 -
剑指offer-数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。归并排序的运用。int InversePairs(int *data, int length){ if (data == NULL || length < =0) return 0; int *copy = new int[length];原创 2017-08-04 20:41:06 · 239 阅读 · 0 评论 -
剑指offer-二进制中1的个数
输入一个整数,输出该树而至今表示中1的个数,其中负数用补码表示。//二进制中1的个数class Solution {public: int NumberOf1(int n) { int count=0; while(n!=0) { count++; n=n&(n-1);//依次清空最右边1; } return count;原创 2017-06-21 11:20:52 · 176 阅读 · 0 评论 -
剑指offer-丑数
题目:因子只包含2,3,5的数称作丑数。1为第一个丑数。求第1500个丑数;int Min(int x,int y,int z ){ int min=x<y? x:y; return min<z? min:z; }//丑数int GetUglyNumber(int index){ vector vec; vec.push_back(1); int i=0;原创 2017-08-08 09:54:22 · 240 阅读 · 0 评论 -
剑指offer-两个链表的第一个公共点
题目:输入两个链表,输出两个链表的第一个公共结点。分析:由于单链表的结点,每个结点只有一个next指针,所以 两个链表的连接形式像是一个Y型。经分析:若两个链表存在公共结点,则公共结点位于链表尾部。若我们从链表尾部开始往前比较,最后一个相同的结点就是我们要找的结点。可以在单链表中,只能从头结点开始按顺序遍历,最后才能到达尾结点。类似于后进先出。联想到可以用栈来解决该问题。分别把原创 2017-08-08 09:30:02 · 282 阅读 · 0 评论 -
剑指offer-数组中只出现一次的数
题目:一个整形数组中出了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现了一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)。用异或知识解答,一个数异或本身结果为0,所以遍历整个数组,数组中所有数组相异或,相同数字相异或相抵消,结果为0,则最后结果为两个不同的数相异或的值。保存最后所得值,以该值最后一位为标准,将数组分成两组,0一组,1一组,则两个不同的数字被分到不同原创 2017-07-31 10:43:25 · 240 阅读 · 0 评论 -
剑指offer-翻转单词顺序
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?class Solu原创 2017-06-26 22:03:19 · 213 阅读 · 0 评论 -
剑指offer-左旋字符串
参考《编程之法》;这里可以用reverse函数实现,但是面试的时候,万一面试官不让用reverse就得自己实现了。class Solution {public: string LeftRotateString(string str, int n) { int len=str.length(); if(0==len||0==n) return st原创 2017-06-26 17:07:32 · 241 阅读 · 0 评论 -
剑指offer-排序数组中数字出现的次数
题目:求排序数组中某个数字出现的次数。二分查找的加强版。int GetFirstK(int *data, int length, int k, int start, int end)//数组首地址,数组长度,数字,开始查找位置,结束查找位置;{ if (data == NULL || length == 0 || start > end) return 0; int mid原创 2017-08-05 10:38:04 · 224 阅读 · 0 评论 -
剑指offer-二叉搜索树的后续遍历
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。参考一位牛客大神的答案,完美,思路清晰;class Solution {public: bool VerifySquenceOfBST(vector sequence) { if(!sequence.size()) r原创 2017-05-05 15:15:27 · 216 阅读 · 0 评论 -
剑指offer-构建乘积数组
题目:给定一个数组A[0,1,2...n-1],请构建一个数组B[0,1,2...n-1],其中B中的元素B[I]=A[0]*A[1]**A[I-1]*A[I+1]***A[n-1]。不能使用除法。void multiply(const vector &array1, vector &array2){ int length1 = array1.size(); int leng原创 2017-08-24 10:32:15 · 231 阅读 · 0 评论 -
剑指offer-二叉搜索树中的第k个结点
题目:给定一颗二叉搜索树,请找出其中的第k大的结点。二叉搜索树的中序遍历是数值递增排序的,因此只需要中序遍历二叉搜索树,就可找到第k大的结点。struct BinaryTree{ int data; BinaryTree *left; BinaryTree *right;};//二叉搜索树的第K个结点BinaryTree *KthNode(B原创 2017-08-25 21:20:14 · 309 阅读 · 0 评论 -
剑指offer-按之字形顺序打印二叉树
题目:实现一个函数按照之字形顺序打印二叉树。struct BinaryTree{ int data; BinaryTree *left; BinaryTree *right;};void print(BinaryTree *pRoot){ if(pRoot==NULL) return; stack level[2];原创 2017-08-25 12:32:56 · 303 阅读 · 0 评论 -
剑指offer-把二叉树打印成多行
题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印到一行。struct BinaryTree{ int data; BinaryTree *left; BinaryTree *right;};void print(BinaryTree *pRoot){ if (pRoot == NULL) return; queue nodes;原创 2017-08-25 09:47:38 · 248 阅读 · 0 评论 -
剑指offer-对称的二叉树
题目:判断二叉树是否是镜像的。//对称的二叉树;bool isSymmetrical(BinaryTree *pRoot){ return isSymmetrical(pRoot,pRoot);}bool isSymmertrical(BinaryTree *pRoot1, BinaryTree *pRoot2){ if (pRoot1 == NULL&&pRoot2原创 2017-08-24 19:57:42 · 231 阅读 · 0 评论 -
剑指offer-中序遍历的下一个结点
题目:求二叉树中序遍历的下一个结点。根据二叉树中序遍历的特点,中序遍历是从小到大排序的,以左根右顺序依次遍历二叉树。/找出中序遍历的下一个结点struct BinaryTree{ int data; BinaryTree *left; BinaryTree *right; BinaryTree *parent;};BinaryTree *GetNext(Bin原创 2017-08-24 19:46:33 · 323 阅读 · 0 评论 -
剑指offer-删除链表中重复的结点
题目:在排序链表中,删除重复的结点。struct ListNode{ int data; ListNode *next;};void deleteDuplication(ListNode **head){ if (head == NULL || *head == NULL) return; ListNode *preNode = NULL; ListNode原创 2017-08-24 18:41:13 · 251 阅读 · 0 评论 -
剑指offer-重建二叉树
给出某二叉树的前序遍历和中序遍历,重建二叉树。假设输入的前序遍历和中序遍历结果中不含重复的数字。例如输入前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6},重建二叉树并返回。原创 2017-04-20 12:57:46 · 305 阅读 · 0 评论 -
剑指offer-连续子数组的最大值
HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向量的长度至少是1)原创 2017-06-26 08:09:42 · 300 阅读 · 0 评论 -
剑指offer-合并链表
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减的规则。非递归版本:/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode原创 2017-06-13 14:28:16 · 195 阅读 · 0 评论 -
剑指offer-对称的二叉树
请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NUL原创 2017-05-09 08:16:19 · 211 阅读 · 0 评论 -
剑指offer—二叉搜索树的第K个结点
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。提议分析: 中序遍历即按照结点由小到大的顺序排列的,寻找第K大的结点,需中序遍历。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNod原创 2017-05-09 08:12:59 · 208 阅读 · 0 评论 -
剑指offer-二叉树的下一个结点
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。原创 2017-05-08 21:16:53 · 179 阅读 · 0 评论 -
剑指offer-平衡二叉树
输入一棵二叉树,判断该二叉树是否是平衡二叉树。注:平衡二叉树不一定是二叉搜索树,两者无必然联系。class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot==NULL) return true; int L=get原创 2017-05-08 16:15:27 · 214 阅读 · 0 评论 -
剑指offer-二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2017-05-08 16:04:02 · 169 阅读 · 0 评论 -
剑指offer-删除特定元素结点
难点分析一级指针与二级指针易混用;struct linkList{ int data; struct linkList *next;};typedef struct linkList link;原创 2017-04-03 14:14:39 · 419 阅读 · 0 评论 -
剑指offer—二叉树中和为特定值的所有路径
输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right原创 2017-05-05 15:56:24 · 233 阅读 · 0 评论 -
剑指offer-树的子结构
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:空树不是任意一个树的子结构)解题思路:1)先找出A中是否存在B根节点; 2)若存在,再分别判断A,B左右子树是否全部相同;struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) :原创 2017-04-23 22:18:19 · 220 阅读 · 0 评论 -
剑指offer-二叉树的镜像
操作给定的二叉树,将其变换为源二叉树的镜像。 解题思路:对于根节点的左右子树,无须再单独考虑是否为空,全部交换。依次递归。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NUL原创 2017-04-26 22:15:51 · 171 阅读 · 0 评论 -
剑指offer-斐波那契数列
要求输入一个整数n,请输出斐波那契数列的第n项;class Solution {public: int Fibonacci(int n) { if(n==0) return 0; if(n==1) return 1; int res; int res0=0;原创 2017-06-07 22:11:25 · 246 阅读 · 0 评论 -
剑指offer-反转链表
输入一个链表,反转链表后,输出链表所有元素。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead原创 2017-06-12 20:15:53 · 192 阅读 · 0 评论 -
剑指offer-链表中倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* FindKthToTail(ListNode* pLis原创 2017-06-12 17:13:52 · 185 阅读 · 0 评论 -
剑指offer-奇偶排序
输入整数数组,实现一个函数来调整数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置保持不变。利用尾插法:将偶数先保存删除,再从尾部插入即可;class Solution {public: void reOrderArray(vector &array) { vector ::iterator原创 2017-06-12 16:15:50 · 351 阅读 · 0 评论 -
剑指offer-跳台阶
青蛙一次可以跳一次,也可以跳两次,n阶台阶多少种可能性法一:class Solution {public: int jumpFloor(int number) { if(number==0) return 0; int i=0,j=1; int n=0; for(int k=0;k<number;k++原创 2017-06-09 19:10:49 · 162 阅读 · 0 评论 -
剑指offer-两个栈实现一个队列
两个栈实现一个队列,要保证整个组合的顺序不能改变。class Solution{public: void push(int node) { stack1.push(node); } int pop() { int a; if(stack2.empty()) { while(!stack1.empty())原创 2017-06-20 22:08:20 · 166 阅读 · 0 评论 -
剑指offer-不用加减乘除求和
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。思路:用位运算,二进制的运算过程,作和:不算进位,全1为0,全0为0,0 1 为1 ,相当于异或;进位:全1为1,其余为0,而且要左移一位重复上述步骤没有进位即停止计算。class Solution {public: int Add(int num1, int num2) {原创 2017-06-29 11:28:14 · 315 阅读 · 0 评论 -
剑指offer-求前n项和
求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)看的大神的代码。脑洞太大了,服的666。class Solution {public: int Sum_Solution(int n) { bool a[n][n+1]; return sizeof(a)>原创 2017-06-29 10:30:48 · 300 阅读 · 0 评论 -
剑指offer-数值的整数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。快速幂的应用,降低时间复杂度。class Solution {public: double Power(double base, int exponent) { double ans=1; int n; if(exponent>0) {原创 2017-06-29 09:52:03 · 294 阅读 · 0 评论 -
剑指offer-链表中环的入口点
题目:一个链表中包含环,如何找出环的入口结点。ListNode *MeetingNode(ListNode *head)//找出环中的一个结点,利用快慢指针来实现;{ if (head == NULL) return NULL; ListNode *slow = head->next; ListNode *quick = head->next; if (slow ==原创 2017-08-24 15:26:34 · 318 阅读 · 0 评论