diff --git a/exampleSite/content/post/给个offer/index.zh-cn.md b/exampleSite/content/post/给个offer/index.zh-cn.md index 1af3854..b672968 100644 --- a/exampleSite/content/post/给个offer/index.zh-cn.md +++ b/exampleSite/content/post/给个offer/index.zh-cn.md @@ -17,6 +17,8 @@ This article offers a sample of basic Markdown. # 正文开始 +如果考到数论的题,会做你就做,不会做你就说你对数论这块不太熟悉,数论这个面算法工程师考的比较多,做开发的话链表比较多 + ## 1.41. 包含min函数的栈 ```cpp @@ -799,24 +801,146 @@ public: -## 28.67.数字在排序数组中出现的次数 +## ## 29.37. 树的子结构 +```cpp +以根为开始,开始进行p1与p2的匹配: +需要另写一个函数进行匹配,函数的参数是以p1,p2为根节点的一段小树 +函数内部实现: +1.p2为空.说明之前的匹配好了,直接return true; +2.p1为空 或者 p1和p2的值不匹配,直接return false; +3.没有被条件1和2直接return,说明当前的节点是匹配的,我们接着 +匹配左左和右右,是且的关系 +class Solution { +public: + bool dfs(TreeNode* p1, TreeNode* p2) + { + if(!p2)return true; + if(!p1 || p1->val != p2->val)return false; + //此时,当前节点是匹配的 + return dfs(p1->left,p2->left) && dfs(p1->right,p2->right);//左边匹配且右边匹配 + } + bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { + if(!pRoot1 || !pRoot2)return false; + if(dfs(pRoot1,pRoot2))return true;//遍历当前节点 + return hasSubtree(pRoot1->left,pRoot2) || hasSubtree(pRoot1->right,pRoot2);//下一个节点 + } +}; +``` + + + ## 30.46. 二叉搜索树的后序遍历序列 +```cpp +//和那个重建二叉树思路有一点点类似 +//画图确定范围 +class Solution { +public: +//1.搞一个全局变量 + vector seq; + + bool verifySequenceOfBST(vector sequence) { + seq = sequence; + return dfs(0, seq.size() - 1);//dfs的是范围 + } + + //dfs的是范围 + bool dfs(int l, int r) { + if (l >= r) return true; // 1.如果子序列为空或只有一个节点,它必然是BST的后序遍历结果 + int root = seq[r]; // 2.根节点 子序列的最后一个节点是当前子树的根节点 + int k = l;//左右子树的分界线(找到右子树的第一个元素) + while (k < r && seq[k] < root) k++; // 找到左子树和右子树的分界点 + for (int i = k; i < r; i++)//遍历右子树,如果右子树中,有元素小于根节点就不满足二叉搜索树 + if (seq[i] < root) + return false; // 如果在右子树中找到比根节点小的值,则不是合法的BST后序遍历 + return dfs(l, k - 1) && dfs(k, r - 1); // 递归检查左子树和右子树 + } +}; + +``` + +![1714141505536](图片/1714141505536.png) + ## 31.26. 二进制中1的个数 +```cpp +//记住就好, x与-x的与 +int lowbit(int x){ + return x&(-x); +}//可以得到最后一个1 +``` + + + ## 32. 49. 二叉搜索树与双向链表 -## 33.62. 丑数 + + + + + ## 34.32. 调整数组顺序使奇数位于偶数前面 + +```cpp +维护两个指针,一个从头一个从尾 +使得:前指针前面都是奇数,后指针都是偶数 + +前指针遇到偶数就停下来,遇到奇数就前进 +后指针遇到奇数就停下来,遇到偶数就前进 + +如何前指针的下标和后指针的下标不同,就交换两个数 +while(i < j) +{ + while() + while() +} +class Solution { +public: + void reOrderArray(vector &array) { + int i = 0 ,j =array.size()-1; + while(i < j) + { + while(i