刷题
leetcode
青青子衿0
小小菜鸟,想要长高。
展开
-
剑指Offer 32 从上到下打印二叉树(三)
原地址注意:1.边界判断2.vector插入vec.insert(vec.begin(),TargetVec.rbegin(),TargetVec.rend());思路和层序遍历二叉树一样,但是每次遍历一层时判断一下flagclass Solution {public: vector<vector<int>> levelOrder(TreeNode* root) {if(root == nullptr) return vector<v.原创 2021-12-07 09:58:09 · 3130 阅读 · 0 评论 -
剑指Offer04 二维数组中的查找
原地址思路:因为是递增的二维数组,所以从左下角开始搜索,当target>cur时,row++;target<cur时,col--;注意:比较时不能连续if判断,因为会影响 if(matrix[col][row] == target)return true; if(matrix[col][row] < target)row++; //会影响下面的判断 if(matrix[col][row] > target)col--;clas原创 2021-12-06 09:44:42 · 64 阅读 · 0 评论 -
剑指Offer 层序遍历二叉树
原地址流程:特例处理: 当根节点为空,则返回空列表 [] ;初始化: 打印结果列表 res = [] ,包含根节点的队列 queue = [root] ;BFS 循环: 当队列 queue 为空时跳出;新建一个临时列表 tmp ,用于存储当前层打印结果;当前层打印循环: 循环次数为当前层节点数(即队列 queue 长度);出队: 队首元素出队,记为 node;打印: 将 node.val 添加至 tmp 尾部;添加子节点: 若 node 的左(右)子节点不为空,则将左(右)子节点加入原创 2021-12-05 23:48:45 · 290 阅读 · 0 评论 -
剑指Offer09 回文数
原地址1.很傻的方法,先翻转在比较,用long接收class Solution {public: bool isPalindrome(int x) { if(x < 0) return false; long temp = 0; int n = x; while(n) { temp = temp * 10 + n % 10; n /= 10; }原创 2021-12-04 22:56:21 · 71 阅读 · 0 评论 -
leetcode 07 整数反转
原地址x = x %10; x /= 10;这两行代码是取每一位数字的基本操作了,问题是边界问题,这次用了C++的内置宏 INT_MAX和 INT_MIN来判断边界class Solution {public: int reverse(int x) { long n = 0; while(x) { n = n *10 + x % 10; x /= 10; } ...原创 2021-12-04 22:32:28 · 3614 阅读 · 0 评论 -
剑指Offer 58 左旋转字符串
原地址class Solution {public: string reverseLeftWords(string s, int n) { if(n == 0) return s; if(s.empty())return s; string left,right; for(auto c:s) { if(n > 0){ left.push_back(c);原创 2021-12-04 22:21:44 · 174 阅读 · 0 评论 -
剑指Offer05 替换空格
原地址class Solution {public: string replaceSpace(string s) { //字符数组 string array; //存储结果 for(auto & c : s) { if(c == ' ') { array.push_back('%'); array.push_back('2'); array.push_back(原创 2021-12-04 22:12:35 · 164 阅读 · 0 评论 -
剑指Offer 35 复杂链表的复制
原地址方法:回溯 + 哈希表对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。class Solution {public: Node* copyRandomList(Node* head) { if(head == nullptr) return nullptr; unordered_map<Node*,Node*&g.原创 2021-12-04 22:06:13 · 409 阅读 · 0 评论 -
剑指offet 24 翻转链表
原地址翻转很容易想到用栈,注意每次新建一个节点class Solution {public: ListNode* reverseList(ListNode* head) { if(head == nullptr) return nullptr; stack<int>stk1; ListNode * p = head; while(p){ stk1.push(p->val);原创 2021-12-03 10:26:08 · 329 阅读 · 0 评论 -
剑指offer 06 从尾到头打印链表
原地址反迭代器 栈1.很容易想到的方法,从头遍历一遍,然后再返回vec的反迭代器class Solution {public: vector<int> reversePrint(ListNode* head) { if(head == nullptr)return vector<int>(); vector<int>vec; ListNode * p = head; while(.原创 2021-12-03 09:13:44 · 550 阅读 · 0 评论 -
链表 判断链表是否有环
1.方法1,hash表我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。class Solution {public: ListNode *detectCycle(ListNode *head) { unordered_set<ListNode *> visited; while (head != nullptr) { if (visited.count(head)) {原创 2021-12-02 21:07:24 · 76 阅读 · 0 评论 -
链表 判断链表是不是回文链表
原地址思路:用栈和队列遍历一遍,然后再比较class Solution {public: bool isPalindrome(ListNode* head) { queue<int> que; stack<int> sta; ListNode * p = head; while(p) { que.push(p->val); sta.push原创 2021-12-02 20:42:05 · 848 阅读 · 0 评论 -
链表 - 判断两个链表是否有交点
原地址解题思路定义双指针,分别指向A和B的头部。如果链表一样长且有交点,则第一次遍历就能找到相同交点,返回如果不一样长且有交点,则指针遍历一条链表后,遍历另一条链表如:A链表的指针遍历完A了,下一步继续遍历B链表。B链表的指针遍历完B了,下一步继续遍历A链表。如图所示,由于a+c+b=b+c+a,所以两个指针在第二次遍历的时候,一定会在相交节点处相遇。如果没有交点,则第二次遍历结束都是null,遍历结束,返回nulla+b=b+a,最终一定都会指向null。..原创 2021-12-02 20:23:59 · 534 阅读 · 0 评论 -
剑指offer30 包含 min 函数的栈
思路:用一个辅助栈来放最小值,push时,要是比辅助栈的top还小就入辅助栈,否则辅助栈再添加一次栈顶元素class MinStack {public: /** initialize your data structure here. */ MinStack() { } void push(int x) { m_stack.push(x); if(m_tempStack.size()){ if(m_tempStack原创 2021-12-02 19:08:41 · 164 阅读 · 0 评论 -
bilibili二面面经
1.什么是移动构造函数?2.c++11说一说你知道的3.构造函数初始化顺序与调用顺序4.说一下四种智能指针5.weak_ptr如何解除shared_ptr的资源互相占用,手写下来6.前置声明7.c++文件到二进制可执行文件的步骤8.map和unordered_map的底层原理9.avl树、红黑树、B+树10输入www.bilibili.com之后发生了什么11DNS解析原理12c++内存布局,出了几道sizeof的题13四种强转的作用,说一下为什么14Qt原创 2021-11-22 11:11:54 · 573 阅读 · 0 评论 -
剑指Offer 判断二叉树是否对称
递归判断左子树的左孩子是否等于右子树的右孩子,左子树的右孩子是否等于右子树的左孩子。注意边界条件class Solution {public: bool isSymmetric(TreeNode* root) { if(root == nullptr) return true; return dfs(root->left,root->right); } bool dfs(TreeNode * r1,Tre原创 2021-11-18 02:36:57 · 55 阅读 · 0 评论 -
剑指offer 从尾到头打印链表
思路:1.用临时List指针指向链表2.用vector装val,并返回vector<int>(vec.rbegin(),vec.rend());class Solution {public: vector<int> reversePrint(ListNode* head) { auto tempPtr = head; vector<int>vec; if(tempPtr == nullptr)re.原创 2021-11-18 02:22:18 · 149 阅读 · 0 评论 -
剑指offer 从上到下打印二叉树
思路,将二叉树从根节点入队列1.循环出队列,并加到res中2.出队列的节点的左右节点再入队列3.直到队列为空class Solution {public: vector<int> levelOrder(TreeNode* root) { vector<int>res; if(!root) return res; queue<TreeNode*>que; que.push(roo原创 2021-11-18 02:12:53 · 49 阅读 · 0 评论 -
智力题-面试
程序员面试必看30道智力题_2020GetGoodOffer的博客-CSDN博客_程序员面试智力题二进制问题金条问题有个商人雇用了一位手艺高超的工匠了为他做一个精致产品,工作一星期七天的代价是一条金条。商人手头上有一条金条,刚好有可以付工匠一星期的工钱。但工匠要求工钱要按每天来付。虽然他并不急着用钱,每天有钱进账,老人心里总是踏实一些。但商人家中有个规矩,金条每星期只能切二刀。后来商人想出以了个切割金条的办法,满足了工匠的要求。你知道商人是怎么切割金条才能满足工匠的吗?切成1、2、4.转载 2021-11-18 01:26:37 · 199 阅读 · 0 评论 -
智力题:老鼠和毒药
有 1000 个一模一样的瓶子,其中有 999 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 10 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?解决方法步骤一:给这1000瓶标号:1,2,3,4,5,6…1000,并分别转化为2进制 1:0000000001 2:0000000010 3:0000000011 4:0000000100 ......1000:1111101000步骤二:让第i只老鼠,喝掉所有二进制表...原创 2021-11-18 01:02:47 · 561 阅读 · 0 评论 -
智力题-最少次数获取摔破小球的楼层
100层楼,球可能在某一层摔坏,问每次用2个球,最坏情况下几次测试可以找出该楼层先出答案,14 投掷次数分布不均。按最坏情况估计,这种方法就多做了几次。为了使最坏情况的投掷数最小,我们希望无论临界段在哪里,总的投掷数都不变,也就是说投掷数均匀分布。 接下来的解决方案就很容易想出了:既然第一步(确定临界段)的投掷数增加不可避免,我们就让第二步(确定临界层)的投掷数随着第一步的次数增加而减少。第一步的投掷数是一次一次增加的,那就让第二步的投掷数一次一次减少。假设第一次投掷的层数是f,转...原创 2021-11-18 00:49:38 · 472 阅读 · 0 评论 -
智力题-天平问题
n个石头,里面有一个是次品,次品比正常的零件轻,现在有一个天平,请问最少称几次一定可以知道哪个零件是次品?样本总数量一开始为n,分成k1,k1,k2,三堆(有两堆重量一样);一次后样品总数变成了k1或者k2要保证一定 k = max{k1,k2}所以尽量三等分8个球,一般人会4-4 2-2 1-1分三次,其实只需要两次分成3 3 2让3 3称重,公式向上取整...原创 2021-11-18 00:07:46 · 548 阅读 · 0 评论 -
剑指offer 18 删除链表的节点
链接两个指针同时向右,cur->val = val; pre->next = cur->next;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ...原创 2021-11-17 23:22:02 · 184 阅读 · 0 评论 -
剑指offer 53 在排序数组中查找数字
链接第一种方法class Solution {public: int search(vector<int>& nums, int target) { int sum = 0; for(auto item : nums) if(item == target) sum++; return sum; }};第二种,二分搜索class Solution {public:原创 2021-11-17 22:51:59 · 165 阅读 · 0 评论 -
剑指offer09 用两个栈实现队列
分析:栈是先进后出,队列是从右到左先进先出class CQueue {public: CQueue() { } void appendTail(int value) { mainStack.push(value); } int deleteHead() { int res = -1; if(mainStack.size()) { while(!mainStack.empty()){原创 2021-11-17 21:45:08 · 161 阅读 · 0 评论 -
剑指offer03 数组中的重复数字
链接class Solution {public: int findRepeatNumber(vector<int>& nums) { map<int,int>mp; for(int i = 0; i < nums.size();i++) { if(mp.count(nums[i])==1)return nums[i]; mp[nums[i]] = i; }原创 2021-11-17 20:57:01 · 158 阅读 · 0 评论 -
bilibili面经
全程90min,面试官人很好,我全程紧张鬼畜抖动自我介绍1.说一下c++的内存布局2.说一下面向对象的三大特性3.websocket长连接是怎么实现的4.vector怎样申请新内存会溢出吗如何重新设置内存大小介绍一下List5.final的作用,答不能被继承追问还有吗,答不知道6.右值引用如何实现完美转发7.map的底层实现原理 map如何从大到小存储8.unorder_map的底层实现原理答哈希表,追问如何避免hash冲突......原创 2022-06-30 11:31:57 · 332 阅读 · 2 评论 -
1.leetcode-001 两数之和
1. 两数之和 - 力扣(LeetCode) (leetcode-cn.com)考察map的用法1.map::count()是C++ STL中的内置函数,如果在映射容器中存在带有键K的元素,则该函数返回1。如果容器中不存在键为K的元素,则返回0。2.两次for循环可以用map记录之前的值来达到一次循环的效果class Solution {public: vector<int> twoSum(vector<int>& nums, int targ原创 2021-11-12 16:26:41 · 515 阅读 · 0 评论