剑指offer
文章平均质量分 53
张荣华_csdn
这个作者很懒,什么都没留下…
展开
-
树中两个节点的最低公共祖先节点
递归的解法如下:public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null||root==p||root==q) return root; TreeNode left = lowestCommonAncestor(ro...原创 2018-08-03 00:02:59 · 529 阅读 · 0 评论 -
圆圈中最后剩下的数字
题目:0,1,2,,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。思路:定义一个关于n和m的方程f(n,m),表示每次在n个数字中删除第m个数字最后剩下的数字。f(n,m)=[f(n-1,m)+m]%n,n>1; =0, n=1;int LastRem...原创 2018-07-27 00:02:33 · 269 阅读 · 0 评论 -
圆圈中最后剩下的数字
题目:0,1,2,,,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里最后剩下的最后一个数字。int LastRemaining_Solution1(unsigned int n, unsigned int m){ if(n < 1 || m < 1) return -1; unsigned int i...原创 2018-07-27 00:02:21 · 214 阅读 · 0 评论 -
扑克牌中的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10位数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:首先把数组排序;其次统计申诉组中0的个数;最后统计排序之后的数组中相邻数字之间的空缺总数。如果空缺总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。需要注意的是,如果数组中的非0数字重复出现,则该数组不是连续的。b...原创 2018-07-25 00:42:04 · 395 阅读 · 0 评论 -
n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输出n,打印出s的所有可能的值出现的概率。动态规划思想:f(n,s)=f(n-1,s-1)+f(n-1,s-2)+f(n-1,s-3)+f(n-1,s-4)+f(n-1,s-5)+f(n-1,s-6) ,0< n<=6n f(n,s)=0, s< n or s>6n or n=1#include <...原创 2018-07-25 00:33:07 · 278 阅读 · 0 评论 -
滑动窗口的最大值
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。vector<int> maxInWindows(const vector<int>& num, unsigned int size){ vector<int> maxInWindows; if(num.size() >= size && size &...原创 2018-07-25 00:32:59 · 169 阅读 · 0 评论 -
左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。char* LeftRotateString(char* pStr, int n){ if(pStr != nullptr) { int nLength = static_cast<int>(strlen(pStr)); if(...原创 2018-07-24 10:36:14 · 163 阅读 · 0 评论 -
和为s的数字
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。bool FindNumbersWithSum(int data[], int length, int sum, int* num1, int* num2){ bool found = false; ...原创 2018-07-22 00:13:35 · 179 阅读 · 0 评论 -
数中唯一只出现一次的数字
题目:在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。如果一个数字出现三次,那么它的二进制表示的每一位也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。 我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位为0;否则为1.int F...原创 2018-07-22 00:13:42 · 296 阅读 · 0 评论 -
数组中数字出现的次数
题目:数组中只出现一次的两个数字。一个整形数组除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。void FindNumsAppearOnce(int data[], int length, int* num1, int* num2){ if(data == nullptr || length < 2) ...原创 2018-07-22 00:13:48 · 1476 阅读 · 0 评论 -
平衡二叉树
题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一颗平衡二叉树。方法一:在遍历树的每个节点额度时候,调用函数TreeDepth得到它的左右子树的深度。如果每个节点左右子树的深度相差都不超过1,那么按照定义它就是一棵平衡二叉树。int TreeDepth(const BinaryTreeNode* pRoot){ ...原创 2018-07-21 00:10:58 · 195 阅读 · 0 评论 -
股票的最大利润
题目:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?例如,一只股票在某些时间节点的杰哥为{9,11,8,5,7,12,16,14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润为11.思路:如果在扫描到数组中的第i个数字时,只要能够记住之前的i-1个数字中的最小值,就能算出当前价位卖出时可能得到的最大利润。int Ma...原创 2018-07-27 00:02:41 · 489 阅读 · 0 评论 -
利用构造函数实现累加
题目:求1+2+3+,,,+n,不能使用循环,只能使用构造函数。class Temp{public: Temp() { ++ N; Sum += N; } static void Reset() { N = 0; Sum = 0; } static unsigned int GetSum() { return Sum; }private: static...原创 2018-07-27 00:02:50 · 696 阅读 · 0 评论 -
利用虚函数实现累加
题目:求1+2+3+,,,+n,要求不能使用循环,只能使用虚函数。思路:把数值变量n转换为bool值。如果对n连续做两次反运算,即!!n,那么非零元素转换为true,零元素转换为false。当值为1的时候调用一个函数,当值为0的时候调用另一个函数。class A;A* Array[2];class A{public: virtual unsigned int Sum (u...原创 2018-07-27 00:02:56 · 227 阅读 · 0 评论 -
树中两个节点的最低公共祖先
思路:先求出根结点到两个节点的路径,保存在链表或者list中,然后问题转换为求两条路径的最后一个公共结点。bool GetNodePath(const TreeNode* pRoot, const TreeNode* pNode, list<const TreeNode*>& path){ if(pRoot == pNode) return tru...原创 2018-07-30 00:01:12 · 217 阅读 · 0 评论 -
1-n整数中1出现的次数
题目:输入一个整数n,求1-n这n个整数的十进制表示中1出现的次数。例如,输入12,1-12这些整数中包含1的数字有1、10、11、12,1一共出现了5次。采用递归的思路int NumberOf1(const char* strN);int PowerBase10(unsigned int n);int NumberOf1Between1AndN_Solution2(int n){...原创 2018-07-18 00:03:53 · 389 阅读 · 0 评论 -
数字序列中某一位的数字
题目:数字以012345678910111213141516,,,的格式序列化到一个字符序列中。在这个序列中,第5位是5(从0开始计数),第13位是1,第19位是4,等等。倾斜一个函数,求任意第n位对应的数字。int countOfIntegers(int digits);int digitAtIndex(int index, int digits);int beginNumber(int...原创 2018-07-18 00:04:07 · 387 阅读 · 0 评论 -
把数组翻译成字符串
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a”,“1”翻译成“b”,,,11翻译成“l”,,,25翻译成“z”。一个数字可能有多个翻译。例如,12558有5种不同的翻译,分别是“bccfi”、“bwfi”、“bczi”、“mcfi”、“mzi”。请编程实现计算一个数字有多少种不同的翻译方法。int GetTranslationCount(int number){ ...原创 2018-07-17 08:54:59 · 359 阅读 · 0 评论 -
礼物的最大价值
题目:在一个mxn的棋盘的每一个都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格,知道到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能达到多少价值的礼物。方法一:动态规划(二维数组存储)int getMaxValue_solution1(const int* values, int rows, int co...原创 2018-07-17 08:54:53 · 324 阅读 · 0 评论 -
最长不含重复字符的子字符串
题目:青葱字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。#include<iostream>#include<string>using namespace std;int longestSubstringWithoutDuplication_2(const std::string& str){int curLength = ...原创 2018-07-17 08:54:32 · 231 阅读 · 0 评论 -
构建乘积数组
题目:给定一个数组A[0,1,,,,n-1],请构建一个数组B[0,1,,,,n-1],其中B中的元素B[i]=A[0]XA[1]X...XA[i-1]XA[i+1]X...XA[n-1].不能使用除法。思路:将数组B分成两部分,定义C[i]=A[0]XA[1]X...XA[i-1],D[i]=A[i+1]X...XA[n-1]。C[i]可以自上而下的顺序计算出阿里,D[i]可以自下而上的顺序...原创 2018-07-28 00:07:34 · 176 阅读 · 0 评论 -
不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得使用加减乘除四则运算符号。思路:将两个整数的加法使用二进制来求和,例如5,17,5的二进制为101,17的二进制为10001,101+10001=10110。 再通过位运算来代替二进制的加法。 第一步不考虑进位对每一位相加,这和异或的结果是一样的。 接着考虑第二步进位,可以理解为两个数先做位与运算,然后再左移一位。 第三步把两个步...原创 2018-07-28 00:07:28 · 155 阅读 · 0 评论 -
利用模板类型实现累加
题目:求解1+2+3+,,,+n,要求不能使用循环,只能使用模板类型。template <unsigned int n> struct Sum_Solution4{ enum Value { N = Sum_Solution4<n - 1>::N + n};};template <> struct Sum_Solution4<1>...原创 2018-07-28 00:06:44 · 542 阅读 · 0 评论 -
利用函数指针实现累加
题目:求解1+2+3+,,,+n,要求不能使用循环,只能使用函数指针。typedef unsigned int (*fun)(unsigned int);unsigned int Solution3_Teminator(unsigned int n) { return 0;}unsigned int Sum_Solution3(unsigned int n){ s...原创 2018-07-28 00:06:35 · 1512 阅读 · 0 评论 -
二叉树的深度
题目:输入一棵二叉树的根结点,求该树的深度。struct BinaryTreeNode{int m_nValue;BinaryTreeNode* m_pLeft;BinaryTreeNode* m_pRight;}如果一棵树只有一个节点,那么它的深度为1.如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度加1;同样,如果根节点只有右子树而没有左子树,那么树的...原创 2018-07-21 00:10:50 · 294 阅读 · 0 评论 -
二叉搜索树的第K大结点
题目:给定一个二叉搜索树,请找出其中第K大的结点。如果按照中序遍历的顺序遍历一棵二叉搜索树,则遍历序列的数值是递增排序的。只需要用中序遍历算法遍历一棵二叉树搜索树,很容易找出第K大结点。const BinaryTreeNode* KthNode(const BinaryTreeNode* pRoot, unsigned int k){ if(pRoot == nullptr || ...原创 2018-07-21 00:10:43 · 436 阅读 · 0 评论 -
善于学习、沟通的人也善于提问
面试官有一个很重要的任务,就是考查应聘者的学习愿望及学习能力。学习能力怎么体现呢?面试官提出一个新概念,应聘者没有听说过它,于是他在自己已有的理解的基础上提出进一步的问题,在得到面试官的答复之后,思考再提问,几个来回之后掌握了这个新概念。 这个过程能够体现应聘者的学习能力。通常学习能力强的人具有主动积极的态度,对未知的领域有很强烈的求知欲望。因此,建议应聘者在面试过程中遇到不明白的地方多提问,这...原创 2018-07-21 00:09:52 · 680 阅读 · 0 评论 -
学习能力
计算机是一门更新速度很快的学科,每年都有新的技术不断涌现。因此,作为这个领域从业人员的软件工程师需要具备很强的学习能力,否则时间一长聚会跟不上技术进步的步伐。也正是因为这个原因,IT公司在面试的时候,面试官都会重视考察应聘者的学习能力。只有具备很强的学习能力及学习愿望的人,才能不断完善自己的知识结构,不断学习新的先进技术,让自己的职业生涯保持长久的生命力。通常面试官有两种方法考查应聘者的学习能...原创 2018-07-21 00:09:43 · 312 阅读 · 0 评论 -
沟通能力
随着软件、系统功能越来越复杂,开发团队的规模也随之扩张,开发者、测试者和项目经理之间的沟通交流也变得越来越重要。也正因如此,很多公司在面试的时候都会注意考查应聘者的沟通能力。这就要求应聘者无论是在介绍项目经验还是在介绍解题思路的时候,都需要逻辑清晰明了,语言详略得当,表述的时候重点突出、观点明确。我们不能把好的沟通能力理解成夸夸其谈。在面试的时候,知之为知之,不知为不知,对于不清楚的知识点,要...原创 2018-07-21 00:09:33 · 830 阅读 · 0 评论 -
两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。链表结点定义如下:struct ListNode{int m_nKey;ListNode* m_pNext;};从链表结点的定义可以看出,这两个链表是单项链表。如果两个单项链表有公共的结点,那么这两个链表从某一结点开始,它们的m_pNext都指向同一个节点。但由于是单项链表的结点,每个结点只有一个m_pNext,因此从第一个公共结点...原创 2018-07-20 00:15:31 · 312 阅读 · 0 评论 -
数组中的逆序对
题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)、(7,5)、(7,4)、(6,4)、(5,4)。统计逆序对的过程:先把数组分隔成子数组,统计出子数组内部的逆序对的数目,然后在统计出两个相邻子数组之间的逆序对的数目。在统计逆序对的过程中,还需要...原创 2018-07-20 00:15:19 · 199 阅读 · 0 评论 -
字符流中第一个只出现一次的字符
题目:字符流中第一个只出现一次的字符。请实现一个函数,用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符“go”时,第一个只出现一次的字符是‘g’;当从该字符流中读出前6个字符“google”时,第一个只出现一次的字符是‘l’。字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位...原创 2018-07-20 00:15:11 · 348 阅读 · 0 评论 -
丑数
题目:我们把只包含因子2、3、5的数称为丑数。求按从小到大的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个丑数。创建数组保存已找到的丑数,用空间换时间的解法class Solution {public: int nthUglyNumber(int n) { vector<int> nums(1,1);...原创 2018-07-20 00:14:59 · 253 阅读 · 0 评论 -
把数字翻译成字符串的方法数
采用递归,从右向左int GetTranslationCount(const string& number);int GetTranslationCount(int number){ if(number < 0) return 0; string numberInString = to_string(number); return GetTransla...原创 2018-06-02 15:33:27 · 462 阅读 · 0 评论 -
把数组排成最小的数
#include<iostream>#include<vector>#include<string>#include<algorithm>using namespace std;bool cmp(string a, string b){ return a + b < b + a ? true : false;}string getmin(vec...原创 2018-06-02 15:03:45 · 131 阅读 · 0 评论 -
数字序列中某一位的数字
数字以01234567891011121314……的格式序列化到一个字符序列中。求任意第n位数字对应的数字。#include <iostream>#include <algorithm>using namespace std;int countOfIntegers(int digits);int digitAtIndex(int index, int digits);int...原创 2018-06-02 14:29:05 · 283 阅读 · 0 评论 -
判断出栈序列是否合法
1)如果当前栈为空,且入栈序列不空,则,入栈序列的下一个元素入栈;2)如果当前栈顶元素不等于出栈序列的首元素,那么入栈序列一直入栈,知道入栈序列为空。3)如果当前栈顶元素等于出战序列的首元素,那么栈顶元素弹出,出栈序列第一个元素移走;4) 如果入栈序列为空,出栈序列第一个元素仍然不等于栈顶元素,则表示2个序列是不匹配的。#include<iostream>#include<sta...原创 2018-07-14 00:05:25 · 2476 阅读 · 0 评论 -
判断数组是否为某二叉搜索树的后序遍历
#include<iostream>#include<vector>using namespace std;bool VerifySquenceOfBST(int sequence[], int length){ if (sequence == nullptr || length <= 0) return false; int root = sequence[len...原创 2018-07-14 00:05:33 · 152 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。void FindPath(BinaryTreeNode* pRoot, int expectedSum, vector<int>& path, int& currentSum){ currentSum += pRoot->m_nValue; path.p...原创 2018-07-14 00:06:00 · 177 阅读 · 0 评论 -
数组中数值和下标相等的元素
题目:假设一个单调递增的数组里的每个元素都是整数并且是唯一的。请编程实现一个函数,找出数组中任意一个数值等于其下标的元素。例如,在数组{-3,-1,1,3,5}中,数字3和它的下标相等。方法一:从头到尾依次扫描数组中的数字,并逐一检验数字是不是和下标相等。时间复杂度为O(n)。方法二:由于数组是单调递增排序的,因此我们可以尝试二分查找算法来进行优化。假设我们某一步抵达数组中的第i个...原创 2018-07-21 00:10:35 · 2686 阅读 · 0 评论