
剑指offer(C++)
剑指offer刷题记录
philpanic9
这个作者很懒,什么都没留下…
展开
-
解决面试题思路——画图让抽象问题形象化
这里写自定义目录标题面试题27:二叉树的镜像面试题28:对称的二叉树面试题29:顺时针打印数组面试题27:二叉树的镜像class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if(root != NULL){ TreeNode* temp = root->left; root->left = root->right; r原创 2020-11-08 18:59:28 · 612 阅读 · 0 评论 -
高质量代码篇——代码的鲁棒性
文章目录面试题22:链表中倒数第k个节点面试题22:链表中倒数第k个节点原题链接/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: ListNode* getKthFromEnd(L原创 2020-08-22 20:35:37 · 432 阅读 · 0 评论 -
判断链表是否有环并找到环的入口
本篇博客给出的解法都是在O(1)的空间复杂度内解决问题,O(n)则可直接使用字典将遍历到的链表的结点存储下来,问题迎刃而解。判断是否有环 141. 环形链表 例如上图这样的一个链表,图中的链表是存在环的,一种解决方法就是使用快慢指针,使用两个指针,均从head出发,慢指针每次走一步,快指针每次走两步,如果链表中存在环则在快慢指针一定会在某个时刻相遇。 为什么一原创 2020-08-05 21:22:33 · 248 阅读 · 0 评论 -
高质量代码篇——代码的完整性
面试题16:数值的整数次方:原题链接class Solution {public: double myPow(double x, int n) { /* 思路:本题主要考点在于代码的完整性,解题时需要注意尽可能地考虑到边界情况和特例 */ long int Ln = (long int)n; // 注意n的取值范围,为int的最小值时直接乘以-1转为正数会出错 if(abs(x - 0.0) < 0.0000001)原创 2020-07-30 20:26:25 · 374 阅读 · 0 评论 -
算法和数据操作篇——位运算
面试题15:二进制中1的个数 原题链接class Solution {public: int hammingWeight(unsigned int n) { /* 方法1:n与1做与运算,不断右移,得到1的个数,这样的方法存在的问题是如果输入的是负数且移位后做符号扩展则会死循环 方法2:设置一个flag=1,将flag与n做与运算,不断左移flag,直到flag为0 方法3:将n与n-1做与运算,这样能够将n的最右边的1变为0,不断原创 2020-07-24 19:40:23 · 116 阅读 · 0 评论 -
算法和数据操作篇——动态规划和贪婪算法
面试题14:剪绳子原题链接class Solution {public: int cuttingRope(int n) { /* 思路:剪长度为n的绳子,第一次剪完后两段绳子长度变为了k和n-k,此时绳子的数量变为了2,满足了题干中的m>1的限制,所以剪完后的两段绳子可以继续剪,也可以不继续剪,取决于怎样能够最终的乘积最大,如果需要继续剪,则子问题和剪长度为n的绳子的求解是一样的,具体三种情况见下面的注释。 时间复杂度 O(n^2) 空间复杂度 O(原创 2020-07-24 19:20:11 · 121 阅读 · 0 评论 -
算法和数据操作篇——回溯法
面试题12:矩阵中的路径:原题链接class Solution {public: bool has_word(int x, int y, vector<vector<char>>& board, string& word, int index, vector<vector<int>>& mark){ // 从board[x][y]出发,寻找word[index],mark矩阵表示某个位置的字符是否已经被使用原创 2020-07-19 10:02:30 · 144 阅读 · 0 评论 -
算法和数据操作篇——查找和排序
面试题11:旋转数组的最小数字原题链接class Solution {public: int minArray(vector<int>& numbers) { // 顺序搜索,O(n),没有考虑数组是有序数组旋转后得到的,不够优秀! // 二分搜索,O(log n) int n = numbers.size(); int index1 = 0, index2 = n-1; int mid = in原创 2020-07-18 19:09:49 · 155 阅读 · 0 评论 -
算法和数据操作篇——递归和循环
面试题10:斐波那契数列原理链接class Solution {public: int fib(int n) { /* 思路:使用a,b,c三个变量,满足关系c=a+b 当前 a b c 下一步 a b c 时间复杂度 O(n) 空间复杂度 O(1) */ int mod = 1000000007;原创 2020-06-13 21:40:34 · 162 阅读 · 0 评论 -
数据结构篇——栈和队列
面试题9:用两个栈实现队列 原题链接class CQueue { stack<int> sk1, sk2;public: CQueue() { } void appendTail(int value) { sk1.push(value); } int deleteHead() { if(sk2.empty()){ if(sk1.empty())原创 2020-06-09 19:38:23 · 139 阅读 · 0 评论 -
数据结构篇——树
面试题7:重建二叉树原题链接方法1:使用vector存储左右子树的前序、中序遍历结果然后直接递归调用建树函数。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */cla原创 2020-06-07 19:28:02 · 313 阅读 · 0 评论 -
数据结构篇——链表
面试题6:从后往前打印链表 题目链接/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public: vector<int> reversePrint(ListNode* head) {原创 2020-06-06 20:07:51 · 112 阅读 · 0 评论 -
数据结构篇——字符串
面试题5:替换空格 题目链接char* replaceSpace(char* s){ /* 思路:统计空格数量,为了避免多次复制,从后复制到前,也可从前向后,复制过程中记录已复制空格数量。 时间复杂度 O(n) 空间复杂度 O(n) */ if(s == NULL) return NULL; int blank = 0; for(int i = 0;i < strlen(s); i++){ if(s[i] ==原创 2020-06-06 19:59:17 · 171 阅读 · 0 评论 -
数据结构篇——数组
一、数组面试题3:数组中重复的数字题目链接class Solution {public: int findRepeatNumber(vector<int>& nums) { /* 思路:遍历数组时将元素逐个归位 时间复杂度 O(n) 空间复杂度 O(1) */ int n = nums.size(); for(int i = 0;i < n; i++){原创 2020-06-06 19:32:26 · 120 阅读 · 0 评论