剑指Offer
文章平均质量分 56
leechow007
这个作者很懒,什么都没留下…
展开
-
24-二叉搜索树的后序遍历序列
传统的解法是利用递归:自己写的:class Solution {public: bool VerifySquenceOfBST(vector sequence) { int t = sequence.size(); if (t==0) { return false; } vector::iterator mark=sequence.begin();原创 2017-06-29 09:47:52 · 227 阅读 · 0 评论 -
33-把数组排成最小的数
c++11新特性--Lambda表达式目录(?)[-]Lambda的形式基本的Lambda使用Lambda与STL的结合lambda使程序更加简单明了在刷题的过程中有时会用到lambda表达式,因此在查阅了相关资料后,写出自己对于lambda表达式的理解,如果有问题,欢迎指出。lambda的优点是:可以编写内嵌的匿名函数,而不必编写独立函数或函数转载 2017-07-10 11:01:32 · 149 阅读 · 0 评论 -
45-圆圈中最后剩下的数字
int LastRemaining_Solution(int n, int m) { if (n==0||m==0) { return -1; } list circle; for (int i = 0; i < n; i++) { circle.push_back(i); } list ::iterator cur = circle.原创 2017-07-22 21:12:47 · 246 阅读 · 0 评论 -
40-数组中出现一次的数字
void FindNumsAppearOnce(vector data, int* num1, int *num2){ int t = data.size(); if (t < 2) return; int res = 0; for (int i = 0; i < t; i++) res ^= data[i]; *num1 = res; *num2 = res; int f原创 2017-07-19 12:53:06 · 156 阅读 · 0 评论 -
46-从1加到n 不用乘除和循环语句
剑指offer 上用的虚函数挺巧妙的:class A;A* shuzu[2];class A {public: virtual int sum(int n){ return 0; }};class B: public A{public: virtual int sum(int n){ return shuzu[!!n]->sum(n - 1) + n; }}原创 2017-07-23 22:23:03 · 1120 阅读 · 0 评论 -
47-不用加减乘除做加法
递归:int Add(int num1, int num2){/* if (num2 ==0) { return num1; } else { int sum = num1^num2; int temp = (num1&num2) << 1; return Add(sum, temp); }*/ //return num2 ? Add(num1^num2,原创 2017-07-23 23:11:50 · 152 阅读 · 0 评论 -
51-数组中重复的数字
第一次写的会有死循环,因为在交换的过程中可能就会出现有相同的情况。第一次写的是都交换完了再比较,应该是交换的过程中比较:错误的:for ( i = 0; i < length; i++) { if (numbers[numbers[i]] == numbers[i] && numbers[i] != i) { break; } else { while (原创 2017-07-24 10:46:06 · 168 阅读 · 0 评论 -
39-二叉树的深度
最大深度: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int l=TreeDepth(pRoot->left); int r=TreeDepth(pRoot->right); return l>r?l+1:r+1;原创 2017-07-18 19:46:46 · 163 阅读 · 0 评论 -
37-两个链表的第一个公共结点
一般的想法是用栈,可是超出内存了。先把两个长的那部分截掉,然后再一一比较。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: int GetLength(ListNode* p原创 2017-07-17 15:45:45 · 220 阅读 · 0 评论 -
1-自己实现string类(赋值运算符函数)
class MyString{public: MyString(char* = nullptr); ~MyString(); MyString& operator=(const MyString &); MyString(const MyString &); bool operator==(const MyString &); void showst原创 2017-08-25 11:21:24 · 649 阅读 · 0 评论 -
2-二维数组的查找
bool Find(int target, vector<vector<int> > array) { int rows=array.size(); int cols=array[0].size(); if(rows==0||cols==0) return false; int i=0;原创 2017-08-25 14:25:59 · 224 阅读 · 0 评论 -
4-替换空格
if (str==NULL||length<=0) { return; } int orignallenghth = 0; int newlenghth = 0; int blanknum = 0; while (str[orignallenghth] != '\0') { if (str[orignalleng原创 2017-08-25 15:16:59 · 203 阅读 · 0 评论 -
16-反转链表
定义三个指针: 一个指向pre: 一个指向cur: 一个指向next: 因为反转链表后,第一个指向的下一个要为null,所以要把pre先设为null; cur指向本节点,然后先保存下一个节点tempnext,因为如果cur的next指针要反向,反向后就找不到next节点了。然后把cur的next指向pre,pre更新为cur,cur更新为tempnext。 丑陋的代码:Lis原创 2017-08-23 11:30:52 · 197 阅读 · 0 评论 -
32-从1到n整数中X出现的次数
链接:https://www.nowcoder.com/questionTerminal/bd7f978302044eee894445e244c7eee6来源:牛客网参考博文:http://www.cnblogs.com/nailperry/p/4752987.html,主要就是从数字出发找规律。一、1的数目编程之美上给出的规律:1. 如果第i位(自右至左,从1开始标号)上转载 2017-07-10 10:27:25 · 324 阅读 · 0 评论 -
44-扑克牌的顺序
bool IsContinuous(vector numbers) { if (numbers.size() != 5) return false; int NumofZero = count(numbers.begin(), numbers.end(), 0); if (NumofZero == 4) return true; sort(numbers.begin()原创 2017-07-21 11:56:16 · 351 阅读 · 0 评论 -
34-丑数
每次我们只用比较3个数:用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的数。脑子有问题,最小的数总是理解不能,先记下来把转载 2017-07-10 15:07:20 · 169 阅读 · 0 评论 -
35-第一个只出现一次的字符
利用哈希表: int FirstNotRepeatingChar(string str) { if(str.length()<=0) return -1; int hashtable[256] = { 0 }; int sub = 0; char res; for (int i = 0; i < str.length();i++) { hashtab原创 2017-07-10 16:10:38 · 152 阅读 · 0 评论 -
25-二叉树中和为某一值的路径
首先明确题意,路径是指到叶子节点,中间的加起来和为期望值的不算!很是不喜欢递归,看评论里面有用非递归的就抄过来参考一下://非递归版本//思路:1.按先序遍历把当前节点cur的左孩子依次入栈同时保存当前节点,每次更新当前路径的和sum;2.判断当前节点是否是叶子节点以及sum是否等于expectNumber,如果是,把当前路径放入结果中。3.遇到叶子节点cur更原创 2017-06-30 10:16:27 · 466 阅读 · 0 评论 -
26-复杂链表的复制
三步:链接:https://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba来源:牛客网class Solution {public: /* 1、复制每个节点,如:复制节点A得到A1,将A1插入节点A后面 2、遍历链表,A1->random = A转载 2017-06-30 18:01:18 · 172 阅读 · 0 评论 -
27-二叉搜索树与双向链表
先中序遍历把各个节点压入vector,然后把每个节点的左右指针接上。这是对我来说最简单的办法了,递归对我来说太绕了struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};c原创 2017-07-03 15:45:02 · 152 阅读 · 0 评论 -
28-字符串的排列
又™递归,又不会,看答案都是一知半解的,下面的代码是抄的讨论区里面的。链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7来源:牛客网class Solution {public: vector Permutation(string str) { //可以用递归来做转载 2017-07-03 17:26:30 · 202 阅读 · 0 评论 -
29-数组中出现次数超过一半的数字
方法一:利用快排思想 如果轴值的下标正好是n/2,那么该轴值就是中位数,如果小于,说明目标数在下标的右侧,对右侧快排,如果大于,对左侧快排。最后下标等于n/2,就是目标数。下面是比较详细的表述:事实上可以不用对数组进行排序,或者说仅部分排序,受快速排序的partition函数的启发,我们可以利用反复调用partition函数来求的该数字。我们现在数组中随机原创 2017-07-06 13:31:02 · 251 阅读 · 0 评论 -
31-连续子数组的最大和
找到状态转移方程:sum[i]为以第i个元素结尾且和最大的连续子数组原创 2017-07-06 21:00:44 · 151 阅读 · 0 评论 -
36-数组中的逆序对
用到了归并排序的思想,有关归并排序:白话经典算法系列之五 归并排序的实现如果前半部分的数组中一个数大于后半部分的某个数,因为子数组是排好序的,所以肯定大于后半部分某数之前的全部数,即j-mid,见代码中,这就是i对应的逆序数目。class Solution {public: long long InversePairsCore(vector& data,原创 2017-07-17 10:27:31 · 161 阅读 · 0 评论 -
41-所有和为s的连续正数序列/递增数列中和为s的两个数字
这里用到一个等差数列公式: Sum=(small+big)n/2; vector > FindContinuousSequence(int sum){ vector v; vector > vv; if (sum < 3) return vv; int small = 1; int big = 2; int n = 2; while (small<(su原创 2017-07-20 20:17:52 · 373 阅读 · 0 评论 -
38-数字在排序数组中出现的次数
int GetFirstK(vector data, int start,int end,int k){ if (start > end) return -1; int mid = (start + end) >> 1; if (data[mid]==k) { if ((mid>0&&data[mid - 1] != k)||mid==0) { return mid;原创 2017-07-17 16:57:55 · 148 阅读 · 0 评论 -
42-反转单词顺序/左旋转字符串
写得好TM low 气死了void ReverseWord(string &s, string::iterator pbegin, string::iterator pend){ if (pend - 1 == pbegin) return ; for (; pbegin != pend && pbegin != --pend; ++pbegin) { auto temp =原创 2017-07-20 23:14:10 · 180 阅读 · 0 评论 -
7-两个栈实现一个队列
入队: 直接进栈1; 出队: 1. 如果栈2不为空,直接弹出栈2栈顶元素; 2. 如果栈2为空,先把栈1的元素依次压入到栈2,然后弹出栈2顶元素。class Solution{public: void push(int node) { stack1.push(node); } int pop() { int res;原创 2017-08-28 12:13:41 · 231 阅读 · 0 评论