c/c++面试
~AC~
这个作者很懒,什么都没留下…
展开
-
堆排序 heapsort
堆是一种数据结构,注意不是二叉树,是数组结构,但是处理堆时可以看成完全二叉树,分为大根堆和小根堆。一:首先初始化堆,保证每个root左右孩子的值均不大于它,且该点需对每个子树的root成立//我这里是调整为大根堆 void init(vector<int>&v) { for (int i = v.size() - 1; i > 0; i--) { ...原创 2018-12-29 00:27:44 · 136 阅读 · 0 评论 -
实现一个容器,在O(1)的时间复杂度下实现插入、删除、取随机数(LeetCode380)---C++实现
思路:利用hashMap和vector,hashMap中保存key和key对应在vector中的索引,删除时vector只需要调用resize函数即可删除尾端元素(前提是将需要删除的元素和尾部元素交换)。 class RandomizedSet {public: /** Initialize your data structure here. */ RandomizedSet() ...原创 2019-05-28 10:02:50 · 815 阅读 · 0 评论 -
至少有K个重复字符的最长子串(LeetCode395)---C++实现
思路:最差的方法是双重循环,时间复杂度O(n^2),所有一定可以优化为O(nlgn)。联想到快排、归并排序,都是分治的思路,这里也是利用分治,关键是找到分治的区分点。遍历字符串,找到出现次数少于k次的字符,位置记为i,分为(0,i-1) 和(i+1, s.size() - 1)两个区间,再递归,最后取两区间的最大值。int longestSubstring(string s, int ...原创 2019-05-28 07:57:27 · 921 阅读 · 0 评论 -
不用乘数号计算1+2+....+n --- C++实现
int getSumFromOneToN(int n){ if(n < 0) return -1; if(n == 0) return 0; char arr[n+1][n]; return sizeof(arr)>>1; //右移一位相当于除以2}原创 2019-05-18 18:02:20 · 199 阅读 · 0 评论 -
求一个数在二进制中1的个数and判断一个数是否是2的幂
5 二进制为101 返回2-1二进制全为1(负数采用补码表示) 返回32这里利用和判断一个数是否是2的幂的方法一致,利用n&(n-1)每次会去除掉最低位的1求二进制中1的个数int getNumOfOne(int n) { int sum = 0; while (n) { sum++; n &= (n - 1); } return sum;}...原创 2019-05-30 13:01:25 · 141 阅读 · 0 评论 -
三角形最短路径问题---C++实现
从倒数第二排开始,利用nums[i][j] = nums[i][j] + min(nums[i + 1][j], nums[i + 1][j + 1]);int getShortestPath(vector<vector<int> >nums) { if (!nums.size()) return 0; for (int i = nums.size() - ...原创 2019-05-21 19:59:32 · 1353 阅读 · 0 评论 -
C++struct和class区别
struct是为了兼容C。这里简要介绍下struct和class的异同点,面试时说出这几点即可。相同点:struct也是一种class,也可以创建对象,也可以有构造、析构函数,也可以使用public、private、protected来封装对象。不同点:struct默认是public级别,也就是没有封装的概念,其内部成员变量、函数的实现细节全部暴露给外界。Tipsstruct中也...原创 2019-05-16 10:37:48 · 106 阅读 · 0 评论 -
逆序输出链表(递归)---C++实现
**顺序输出链表**void printList(node* head) { if (!head) return; cout << head->data << " "; printList(head->next);}**逆序输出链表**void printListByReverseOrder(node* head) { if (!head)...原创 2019-05-21 10:44:25 · 2390 阅读 · 1 评论 -
反转字符串---C++实现
//如果字符串中单词之间有多个空格 反转后的字符串仍保留多个空格//输入" i love you" => "you love i " (注意字符串开头或结尾仍可能有空格)string reverseString(string str) { if (!str.size()) return ""; string res = ""; //返回结果 string su...原创 2019-05-21 10:32:00 · 719 阅读 · 0 评论 -
求集合子集---C++实现
思路:int arr[] = { 0,1,2,3,4 };递归遍历整个数组,遍历到第0个位置,我们就求出含有0的所有子集,遍历到第1个位置,我们就求出含有1不含0的所有子集,依次类推,遍历到第3个位置,我们求出含有3而不含0 1 2 的所有子集。 //loc表示当前位置 loc == len为递归终止条件 void getAllSubSet(int* arr, int len, in...原创 2019-05-20 21:25:19 · 3362 阅读 · 0 评论 -
C++面试Linux常用命令---内存相关
1.top(面试官非常喜欢问)2.df原创 2019-05-14 20:41:43 · 256 阅读 · 0 评论 -
C++面试之linux常用命令---进程相关
1.查看进程的pidps -aux | grep 进程名2.查看进程的端口号netstat -anp | grep pid3.通过端口号查进程pidlsof -i : port原创 2019-05-14 20:35:04 · 243 阅读 · 0 评论 -
C++ explicit关键字作用
#include <iostream>using namespace std;/*explicit关键字*/class Person {public: Person(int age) :age(age) {}; int getAge() { return age; }private: int age;};class Animal {public:...原创 2019-05-09 20:33:41 · 97 阅读 · 0 评论 -
丑数(剑指offer)---C++实现
《参考程序员面试金典》伪代码如下1)初始化array和队列:Q2 Q3 Q52)将1插入array3)分别将12、13 、1*5插入Q2 Q3 Q54)令x为Q2 Q3 Q5中的最小值,将x添加至array尾部5)若x存在于:Q2:将 x * 2、x * 3、x5 分别放入Q2 Q3 Q5,从Q2中移除xQ3:将 x * 3、x5 分别放入Q3 Q5,从Q3中移除xQ5:将 x ...原创 2019-05-13 21:06:53 · 202 阅读 · 0 评论 -
判断平衡二叉树(剑指offer)---C++实现
解法一:前序(中序、后序)遍历二叉树,计算每个结点左右子树高度,查看每个结点是否满足平衡二叉树性质。 复杂度太高!O(nlgn)解法二:在求解树高度的过程中,加入一个标志位flag,只需要遍历一次即可。复杂度O(n)int getDepth(TreeNode* root, bool& flag){ if(root){ int leftDepth = getD...原创 2019-05-13 19:48:50 · 603 阅读 · 0 评论 -
单链表快排(momenta一面题) ---C++面试
下午面了momenta,单链表快排没答出来,是自己能力不够,正好可以查漏。思路:利用节点值域的交换,主要思想还是partiiton,将链表分隔成左右两部分,按照头结点的data(即为tag),左边的data都小于tag,右边的data都大于tagnode* partition(node* &head, node* end) { //链表为空或者head == end 为递归出口...原创 2019-05-23 20:40:07 · 944 阅读 · 0 评论 -
栈的合法输出顺序---C++实现
利用辅助栈,先初始化辅助栈,将输出序列压入栈中,输入序列依次入栈,如果入栈的顶部元素和出栈一致,则入栈和出栈都弹出元素。bool isLegal(const string& str1, const string& str2) { if (!str1.size() || !str2.size()) return false; stack<char>in, o...原创 2019-05-28 19:48:08 · 2112 阅读 · 0 评论 -
判断数组中是否存在递增的三元子序列(LeetCode334)---C++实现
思路:记录两个值,一个small,一个big。遍历数组,如果小于small,则更新small,不然如果小于big,则更新big,如果大于big,则存在递增三元子序列bool increasingTriplet(vector<int>& nums) { int small = INT32_MAX; int big = INT32_MAX; int i = 0; w...原创 2019-05-29 10:05:24 · 695 阅读 · 0 评论 -
快速判断一个数是否是4(2)的幂(LeetCode342)---C++实现
LeetCode OJ链接首先解决怎么判断2的幂 利用与运算,num & (num - 1) 如果为真,则不是。//判断2的幂if (num < 0 || (num & num - 1)) { return false;}return true;其次解决判断4的幂,相对于2的幂,4的幂其实就是1只能出现在奇数位,所以有, num & 0x5555...原创 2019-06-24 10:58:31 · 255 阅读 · 0 评论 -
编辑距离(LeetCode72)---C++实现
先附上LeetCode上此题的OJ网址,有需要可点击直达一般求最短距离、存在性问题、可能性的总数都要想到动态规划。思路:动规核心思想就是空间换时间,用数组存储下之前的信息,计算之后的情况便不需要再重新计算以前的情况了。 这里我们用dp[i][j]表示word1从[0…i - 1]的位置 编辑到word2[0…j - 1]的位置的最短距离(例如对于word1 = “horse”,word2...原创 2019-07-08 09:35:24 · 1011 阅读 · 0 评论 -
约瑟夫环问题,看这个,就够了
戳我转载 2019-06-23 21:56:46 · 288 阅读 · 0 评论 -
合并2个有序链表=> 进阶 合并k个有序链表---C++实现
合并2个有序链表三种方法LeetCode OJ链接(戳我)一般方法有合并2个链表作为前提,再来看这题简直是简单,最简单容易想到该方法。该方法固然可行,但是是两两合并链表,时间复杂度O(nk)(n是链表个数,k是链表长度)空间复杂度O(1)。显然,时间复杂度还不够低,应该优化。node* mergeKLists(vector<node*>& lists) { if...原创 2019-06-22 19:47:59 · 907 阅读 · 0 评论 -
正则匹配(LeetCode10&剑指offer)---C++动态规划解决
vector<vector<bool>>flag(len1 + 1, vector<bool>(len2 + 1, false)); flag[0][0] = true;边界情况这里flag[i][j]表示pattern[0~j-1]是否可以匹配str[0~i-1],(注意flag[i][j] 对于pattern[j - 1] str[i - 1])首先...原创 2019-06-17 20:04:04 · 395 阅读 · 0 评论 -
一道百度C++面试题---memset能否初始化类对象?
正常情况下,是可以使用metset初始化类对象的,但是如果该类含有虚函数,那么这个对象本身指向虚函数表的指针也会被初始化为null,从而找不到该类的虚函数表,当我们想要利用该类发生多态时,程序崩溃,看例子。class Animal {public: virtual void walking() { cout << "animal walking" << end...原创 2019-06-17 10:40:27 · 545 阅读 · 0 评论 -
合并两个有序链表(三种方法)---C++实现
方法一:若要求不能对原始链表更改,则必须使用额外空间//使用额外空间来合并链表 不对原始链表做改变node* mergeTwoLinkListWithExtraPlace(node *head1, node *head2) { /*先创建一个头结点 这里用任意的整数都可以 不一定用0 之后返回newHead->next 即可 该方法在很多时候都可以起到简化代码的作用 值得借鉴*/...原创 2019-06-10 08:42:43 · 30401 阅读 · 0 评论 -
实现sqrt---C++实现
二分实现很容易想,但是效率不够高,这里利用牛顿迭代法实现sqrt方法。迭代公式:ans = (ans + x / ans) / 2;int mySqrt(int x) { double ans = 1.; while (fabs(ans * ans - x) > 1e-6) //精度 ans = (ans + x / ans) / 2; return ans;}...原创 2019-06-19 18:10:09 · 1899 阅读 · 1 评论 -
双指针的巧妙运用=>接雨水(LeetCode42)---C++实现
注意:此题不是求最大阴影面积思路:1.所接的雨水的多少应该和较小一端有关系(木桶原理),首先两个指针分别指向头尾,小的一方先走2.同时记录左右两边最大值,如果此时的值比最大值还大,则更新最大值,否则可以接雨水。int trap(vector<int>& height) { if (height.size() < 2) { return...原创 2019-06-09 21:09:32 · 780 阅读 · 0 评论 -
骚操作=>快速判断一个数是否是某个质数的幂---C++实现
由一道LeetCode题演变而来思路:当然可以通过循环来实现,从1开始乘,每次乘3,即可。这里有个巧妙的方法,由于3是质数,32位有符号整数int中最大的3的幂是1162261467,即可根据1162261467 % n == 0来判断。类似5 7 11 这样的质数也同理(2除外,2的幂可以通过n&n - 1 == 0 来判断 )。bool isPowerOfThree(...原创 2019-06-03 11:20:59 · 854 阅读 · 0 评论 -
加油站(LeetCode134)---C++实现
思路:1.首先介绍一个定理,如果一个整数序列累加和非负,那么一定可以找到一个起点,以该起点开始的序列累加和都非负。2.由1知,只要gas累加和>=cost累加和 解一定存在,反之,一定无解3.进行一次遍历,totalGas记录每个加油站gas[i]-cost[i]的和,curGas记录当前油箱油量,startLoc记录符合要求的起点加油站,所以知道当curGas[i]< 0...原创 2019-06-02 21:28:59 · 508 阅读 · 0 评论 -
C++智能指针循环引用导致的内存泄漏
我们知道,智能指针可以在绝大多数的情况下解决内存泄漏的问题,但是并不能完全解决,比如智能指针的循环引用可能就会导致内存泄漏。class Node {public: Node() { cout << "construction" << endl; } ~Node() { cout << "deconstruction" << en...原创 2019-06-07 22:08:46 · 1207 阅读 · 2 评论 -
子序列组合拳 => 最长连续子序列(leetcode128)&最长递增子序列长度(leetcode300)&最长递增子序列个数(leetcode673)---C++实现
最长连续子序列思路1.空间换时间,利用哈希表存储原始数据。2.遍历原始数组,例如遍历到nums[i],在哈希表中先往num[i]右边找,即num[i] + 1方向;再往左边找,即nums[i] - 1方向。3.优化,每次往左右找时,即可把左右的数在哈希表中删除,防止重复查找 O(n)+O(n)int longestConsecutive(vector<int>&...原创 2019-06-02 10:22:39 · 305 阅读 · 0 评论 -
有序数组中不同平方值的个数(头条面试题)---C++实现
题目:求解一个有序数组不同平方值的个数,{-1,-1,0,1,1}这里平方值只有0,1两种情况,返回2;{-3,-1,0,0,2,3}这里拼房族有0,1,4,9共4中情况,返回4。要求:时间复杂度O(n)空间复杂度O(1)思路:刚开始看到这题,哈希表应该是大多数人都能想到的,且复杂度要求都能满足。就是遍历数组,把每个数的平方放入哈希表中去重即可。但是这种想法很难通过面试,因为有序的...原创 2019-05-29 16:25:21 · 1380 阅读 · 0 评论 -
大数相加---C++实现
#include <iostream>#include <string>using namespace std;/*大数相加*///在字符串前面加0 使2字符串长度相等 这样进行相加时的逻辑判断会较为简单void formatStringWithZero(string& s, int n) { for (int i = 0; i < n; ...原创 2019-04-19 11:38:12 · 1869 阅读 · 1 评论 -
旋转数组的二分查找---C++实现
例如int arr[] = {4,5,6,7,0,1,2,3} ;int arr[] = {5,6,0,1,2,3,4]称为旋转数组 在该数组中实现二分查找思路:每次找mid位置 必有一边是严格单增的 再通过目标值与arr[end]的大小来改变每次搜索的begin和end的值/*旋转数组的二分搜索int arr[] = {4,5,6,7,0,1,2,3}实现二分搜索*/int r...原创 2019-04-23 18:57:13 · 314 阅读 · 0 评论 -
递增可重复数组中求一个数下标最大值(时间复杂度O(lgn))---C++实现
int arr[] = {1,2,3,3,4,4,4,5} 求4的下标 返回6int arr[] = {1,2,3,3,4,4,4,5} 求3的下标 返回3int arr[] = {1,2,3,3,4,4,4,5} 求7的下标 返回-1int getMaxLoc(int* arr, int len, int target) { if (arr && len) { i...原创 2019-04-23 18:30:22 · 231 阅读 · 0 评论 -
已知入栈(出栈)求所有的出栈(入栈)情况---C++实现
#include <iostream>#include <stack>#include <queue>using namespace std;/*根据入栈顺序打印所有的出栈顺序*/static int num = 0;//记录一个输出多少次//in表示入栈顺序 mid表示辅助栈 用来模拟入栈 出栈 out表示出栈顺序void printA...原创 2019-04-12 11:13:15 · 1878 阅读 · 0 评论 -
打印二叉树的所有路径---C++实现
对于大多数树的问题,用递归是个很好的方法。void printAllRoadsOfBtree(node* root,queue<char>& q) { if (!root) { return; } //此时为叶子节点 递归出口 打印路径即可 if (!root->lchild && !root->rchild) { //切记加上叶...原创 2019-04-12 10:40:13 · 1265 阅读 · 0 评论 -
字典树Trie---C++实现
#include <iostream>#include <string>using namespace std;/**Trie树 字典树C++实现*/class TrieNode {public: TrieNode() { end = path = 0; for (int i = 0; i < 26; i++) { nexts[i] ...原创 2019-04-08 13:00:15 · 289 阅读 · 0 评论 -
不使用加减乘除 利用构造函数实现1+2+...+n
C++实现#include <iostream>using namespace std;class Text {public: Text() { num++; sum += num; };public: static int sum; static int num;};int Text::num = 0;int Text::sum = 0;in...原创 2019-03-30 20:23:04 · 185 阅读 · 0 评论 -
找出数组中单独出现的两个数
一个数组,其他数均出现偶数次,只有两个数只出现一次。C++实现#include <iostream>#include <vector>using namespace std;void findTwoNum(const vector<int>&v) { if (v.size()) { int temp; for (int i = ...原创 2019-03-30 20:00:46 · 197 阅读 · 0 评论