C++
码源
这个作者很懒,什么都没留下…
展开
-
二叉搜索树转换双向链表c++
递归版本递归的思想:按照中序遍历每个节点并加入链表更新Plast----将整个树分解成了无数的小树,然后将他们分别转化成了一小段一小段的双向链表,再利用pLast记录总的链表的末尾,然后将这些小段链表一个接一个地加到末尾。class Solution {public: // Plast 节点始终记录已经加入链表的最后一个节点 TreeNode* Plast = NULL...原创 2020-04-06 15:11:37 · 456 阅读 · 0 评论 -
C++默认大小根堆priority_queue求中位数
以前实现大小根堆总要自己写代码,循环父节点和孩子节点比大小换位置,今天看到C++中有默认的大小根堆实现// 大根堆priority_queue<type> BigRoot;// 小根堆priority_queue<type, vector<type>, greater<type>> SmallRoot;当然如果全是正数的话,小根堆实现比较...原创 2020-03-16 19:58:04 · 496 阅读 · 0 评论 -
C++ Two Sum;Three Sum; FourSum--在数组中找两数/三数/四数之和为固定值
首先,本篇解决的问题采用两个指针方法的均假设数组有序的前提下,如果无序,则先通过排序算法使数组有序。1. Two Sum 问题可以通过map解决,vector<int> twoSum(vector<int> &nums, int target) { vector<int> v; map<int, int> hash; ...原创 2019-04-14 21:47:16 · 449 阅读 · 0 评论 -
C++求两个字符串的最长公共子串
文字解释过于繁琐直接上例子:const char* s1 = “ADOBE”;const char* s2 = “ABE”;对于这两个字符串,先标记相同字符的在矩阵中为1否则为0:ADOBEA10000B00010E00001那么公共子串即为对角线为1的,比如‘A’、‘BE’,只需在其中找到最长的1的对角线即可,这...原创 2019-04-02 22:21:06 · 7408 阅读 · 4 评论 -
topK问题,取数组中第k大和前k个大的元素--每日一题
分析用到大顶堆、小顶堆的知识点,正好复习一下:求第k大和前k个大的元素要用大顶堆还是小顶堆呢?如果直观的用大顶堆的话,堆顶是堆的最大值,而我们需要选出前K个最大的数据。如果我们在建堆时最大值被放到了对顶,那之后的k-1个次大值无法放入堆中。所以,选用最大堆只能找出k中的一些最大值,而不是全部。所以我们选用小顶堆,如果大于堆顶最小值则替换堆顶值放入堆中,再调整为最小堆,最终小顶堆存放前k个大...原创 2019-03-28 23:25:16 · 515 阅读 · 0 评论 -
单调栈和单调队列问题
单调队列是什么呢?可以直接从问题开始来展开。Poj 2823给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数。数列长度:N<=106,m<=NN<=106,m<=N解法①很直观的一种解法,那就是从数列的开头,将窗放上去,然后找到这最开始的k个数的最大值,然后窗最后移一个单元,继续找到k个数中的最大值。Alt text这种方法每求...原创 2019-04-02 10:24:10 · 226 阅读 · 0 评论 -
求1-n中每个二进制数中1的个数 C++
这个题有多种解法,比如可以使用归并思路求每个数的二进制中每n(eg.n=4/8)位包含1的个数,再相加求和。当然另外一种思路是,一个数二进制中1的个数是它除去最高位那个1之后1的个数再➕1(因为2^n的二进制只有最高位为1)。比如7的二进制表示为:111(100+011),其中1的个数为1➕011中1的个数,即f(7) = 1+f(3)。代码:#include<iostream&g...原创 2019-04-01 22:10:14 · 1227 阅读 · 1 评论 -
Longest Increasing Path in a Matrix二维矩阵中最长递增路径
思路:设,当前点x(i,j)为终点的最长递增路径长度为f(x(i,j));则,当前点的上下左右节点为终点的最长递增路径长度分别为f(x(i-1,j)), f(x(I+1,j)), f(x(i,j-1)), f(x(i,j+1));此时,如果当前节点的值大于上下左右节点的值,则以当前节点为终点,上一步沿上下左右节点走向当前节点的递增路径长度依次为:up=f(x(i-1,j))+1,down...原创 2019-04-07 11:42:37 · 756 阅读 · 1 评论 -
STL中map和hash_map用法和区别
1. STL map1.1 为什么引入map考虑如何储存一系列key-value的键值对,最简单直观的是用一个数组或者链表保存。但是考虑下这样的插入、查找、删除效率,如果要高效,就需要把这些记录的键按照顺序排列,然后按照二分法查找,同时增加记录的时候也需要保持记录有序。我们如果自己去写需要考虑一系列因素,很麻烦对吧,所以STL中的map已经帮我们设计好了这一全套,我们只需要调用接口就好了。1...原创 2019-04-06 22:25:40 · 961 阅读 · 1 评论 -
C++找出数组中和为N的所有配对(不可重复)--每日一题
和昨天题目类似,唯一不同的是这里要求所用数组中的元素不可重复,那么我们就加上一个标记当前位的标志cur,每次只从cur往后搜索是否可以加进来保证和为N即可,具体看代码:#include <iostream>#include <vector>using namespace std;void SumK(vector<vector<int>>&a...原创 2019-03-28 09:39:36 · 548 阅读 · 0 评论 -
C++找出数组中和为N的所有配对(可重复)--每日一题
emmm我知道又熬夜了不好,但是想不出来不想睡觉啊啊啊O(≧口≦)O今天的问题:如题,先写一个简单的版本实现可重复地选出数组中和为N的所有配对。思路采用递归思想,每次压入数组当前元素,将所求加和的N减去当前元素。代码:#include <iostream>#include <vector>using namespace std;void SumK(vec...原创 2019-03-28 00:24:36 · 841 阅读 · 0 评论 -
C++ 递归 全排列(无重复元素)--每日一题
全排列就是所有元素所有可能的排列【例】1~3 的全排列:1 2 3, 1 3 2 , 2 1 3, 2 3 1, 3 1 2, 3 2 11,2,2的全排列:1 2 2, 2 1 2, 2 2 1先考虑无重复元素的时候:直接在SumK上修改的,具体看代码:#include <iostream>#include <vector>using namespace ...原创 2019-03-29 18:47:57 · 435 阅读 · 0 评论 -
Reorganize String 重构字符串--每日一题
昨天在Google hackathon中有一个模拟面试的环节,面试官问了这样一道题–Given a string S, check if the letters can be rearranged so that two characters that are adjacent to each other are not the same.If possible, output any pos...原创 2019-03-25 20:45:20 · 240 阅读 · 0 评论 -
力扣877. 鸡蛋掉落问题
题目:你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= ...原创 2019-05-05 21:32:43 · 566 阅读 · 0 评论 -
leetcode 301.删除无效括号
题目删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果。【说明:】 输入可能包含了除 ( 和 ) 以外的字符。示例 1:输入: “()())()”输出: ["()()()", “(())()”]示例 2:输入: “(a)())()”输出: ["(a)()()", “(a())()”]示例 3:输入: “)(”输出: [""]思路首先正向(从左向右...原创 2019-05-13 21:02:44 · 452 阅读 · 0 评论 -
力扣212. 单词搜索 II
题目:给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。示例:输入:words = [“oath”,“pea”,“eat”,“rain”] and board =[[‘o’...原创 2019-05-08 23:56:03 · 762 阅读 · 0 评论 -
C++面试常见概念2️⃣--指针引用、const汇总总结
1,指针引用的区别:首先最根本的,指针是地址,引用是别名。1)在使用上,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。也就是说在赋值后,指针可以被重新赋值,即指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,以后不能改变,但是指定的对象其内容可以改变(非const的情况下)。指针可以指向空值,但是引用不可以它初始化的时候就必须指向一个已经存在的对象...原创 2019-05-22 21:06:25 · 183 阅读 · 0 评论 -
计算两字符串之间的距离
这个问题是对问题“已知两个字符串s和t,对s在任意位置执行三种操作:插入一个字符;删除一个字符;替换一个字符,求将s变成t所需要的最少操作次数x”的延伸,其实就是多加一步公式1-x/max(len(s),len(t)),因为将字符串s变成字符串t需要变化的次数越多,那么两个字符串之间的距离就越大。那么如何求字符串s变成字符串t的次数呢,假设len(s)=m,len(t)=n,建立一个[m,n]的...原创 2019-05-12 22:38:33 · 732 阅读 · 0 评论 -
两个数组的交集 II
题目:给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2]输出: [2,2]示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出: [4,9]说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。我们可以不考虑输出结果的顺序。进阶:如...原创 2019-05-11 22:33:17 · 109 阅读 · 0 评论 -
C++面试常见概念--inline、virtual、static汇总总结
inline内联函数简单来说,编译器将inline函数体代码直接复制到inline函数调用点处而非普通函数的函数调用,有点像宏但是比宏更安全会,会做安全检查或自动类型转换。特点:省去了参数压栈、栈帧开辟与回收,结果返回等,加快运行速度;大多类的成员函数(没有循环递归、定义在内类或显示内联等)会自动转化为内联函数;但是也会造成代码膨胀、版本迭代不便、程序员不可控缺点。virtual虚函...原创 2019-05-15 19:52:53 · 413 阅读 · 0 评论 -
力扣208. 实现 Trie (前缀树)
题目:实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 false trie.startsWith(“ap...原创 2019-05-07 23:03:58 · 782 阅读 · 0 评论 -
leetcode 217.存在重复元素
题目给定一个整数数组,判断是否存在重复元素。如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。示例 1:输入: [1,2,3,1]输出: true示例 2:输入: [1,2,3,4]输出: false示例 3:输入: [1,1,1,3,3,4,3,2,4,2]输出: true思路1使用set记录元素,因为se...原创 2019-05-10 17:23:57 · 114 阅读 · 0 评论 -
leetcode189.旋转数组
题目给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步:[7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99...原创 2019-05-10 16:36:07 · 119 阅读 · 0 评论 -
LeetCode152. 乘积最大子序列
题目:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。示例 :输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。思路:记录数组中每一个索引位置值包含进连乘末尾的最大最小值maxhere、minhere(...原创 2019-05-09 17:17:10 · 125 阅读 · 0 评论 -
leetcode334. 递增的三元子序列
题目:给定一个未排序的数组,判断这个数组中是否存在长度为 3 的递增子序列。解释:数学表达式如下:如果存在这样的 i, j, k, 且满足 0 ≤ i < j < k ≤ n-1,使得 arr[i] < arr[j] < arr[k] ,返回 true ; 否则返回 false 。说明:要求算法的时间复杂度为 O(n),空间复杂度为 O(1) 。示例 1:...原创 2019-05-19 11:00:36 · 193 阅读 · 0 评论 -
力扣139.单词拆分I & II
题目:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。示例 1:输入: s = “leetcode”, wordDict = [“leet”, “code”]输出: true解释: 返回 true 因为 “leetcode” 可...原创 2019-05-06 17:57:36 · 698 阅读 · 0 评论 -
力扣131.分割回文串
题目:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: “aab”输出: [ [“aa”,“b”], [“a”,“a”,“b”] ]分析:有点向之前求所有子串问题,采用DP动态规划算法,只是多加上了判断是否为回文串, 在"aab" 一例中可以依次分析如下分割是否满足回文串特性:a-a-ba-abaa-ba...原创 2019-05-06 15:42:55 · 1217 阅读 · 0 评论 -
每日一题--删除链表的倒数第N个节点
题目原文:Remove Nth Node From End of List翻译:删除链表的倒数第N个节点分析双指针遍历,第一个指针开始遍历到第N-1个时第二个指针开始从头遍历,待第一个指针遍历结束的时候,第二个指针指向倒数第N个节点。其他特殊情况:删除的是尾结点1,链表只有一个节点,直接返回null;2,链表不止一个节点,倒数第二个节点指向null。代码#include&l...原创 2019-03-12 22:38:10 · 163 阅读 · 0 评论 -
C++实现快排--每日一题
经常听到面试中要手写快排,小记一下。快排思想:分治思想,每次把一个数据(通常选第一个/最后一个等)放到合适的位置(即它左边都≤它,它右边都≥它),然后再递归排该数左边的数和该数右边的数,代码如下:void quickSort(int a[], int l, int r) { if (l < r) { int ridx = partition(a, l, r);...原创 2019-03-17 10:24:09 · 273 阅读 · 0 评论 -
每日一题--移除字符串中重复的字符(Cracking the Coding Interview)
题目Design an algorithm and write code to remove the duplicate characters in a string without using any additional buffer. NOTE: One or two additional variables are fine. An extra copy of the array is...原创 2019-02-20 22:22:36 · 243 阅读 · 0 评论 -
每日一题--位运算之指定位替换(Google推荐面试书--Cracking the Coding Interview)
题目原文:You are given two 32-bit numbers, M and N, and two bit positions, i and j. Write a method to set all bits between i and j in M equal to N (e.g., N becomes a substring of M located at i and sta...原创 2019-03-02 11:37:51 · 333 阅读 · 0 评论 -
每日一题--找二叉树中两个结点的第一个祖先结点(Google推荐面试书--Cracking the Coding Interview)
题目原文:Design an algorithm and write code to find the first common ancestor of two nodes in a binary tree. Avoid storing additional nodes in a data structure. NOTE: This is not necessarily a binary s...原创 2019-03-01 22:56:02 · 169 阅读 · 0 评论 -
每日一题--链表删除重复结点(Google推荐面试书--Cracking the Coding Interview)
题目原文:Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this problem if a temporary buffer is not allowed?译文:从一个未排序的链表中删除重复结点。进一步地,如果不允许使用临时的额外内存,你如何解决这...原创 2019-02-25 18:14:43 · 130 阅读 · 0 评论 -
每日一题--翻转一个C风格的字符串(Cracking the Coding Interview)
题目Write code to reverse a C-Style String. (C-String means that “abcd” is represented as five characters, including the null character.)写代码翻转一个C风格的字符串。(C风格的意思是”abcd”需要用5个字符来表示,包含末尾的 结束字符)思路代码...原创 2019-02-19 20:25:52 · 103 阅读 · 0 评论 -
每日一题--呼叫中心多线程增进版
说明本版本在昨天的基础上增加控制中心类CallCenter。功能上增加接线员人数控制,当呼叫用户多余接线员数量时提示“忙等待”,同时对接线员进行多线程并行式处理电话,但是在对经理人数和主管人数和并行处理上还未做控制。遇到的问题和之后有待改进的点:1,创建多线程只能调用全局函数,即类中的static函数,但是这里handelcall是虚函数,不能再定义为静态函数 ,故而取舍不继承,不要虚函数...原创 2019-02-24 21:37:41 · 225 阅读 · 0 评论 -
每日一题--检验树是否平衡(Google推荐面试书--Cracking the Coding Interview)
题目原文:Implement a function to check if a tree is balanced. For the purposes of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by ...原创 2019-02-28 17:50:10 · 154 阅读 · 0 评论 -
每日一题--判断一个字符串中的字符是否唯一(Cracking the Coding Interview)
题目Implement an algorithm to determine if a string has all unique characters. What if you can not use additional data structures?用基本数据结构设计完成以下算法:判断一个字符串中的字符是否唯一。解答可以询问面试官字符集由什么组成,一般来讲考虑为ASCII码组成(即考...原创 2019-02-18 20:22:25 · 293 阅读 · 0 评论 -
每日一题--设计一个呼叫中心系统(Google面试推荐书Cracking the Coding Interview)
题目:假设有个呼叫中心,有接线员、经理、主管三种角色。如果接线员无法处理呼叫,就上传给经理;如果仍无法处理,则上传给主管。请用代码描述这一过程。分析:典型的职责链设计模式的题目,今天第一次练习,该题目可以大概设计成两个类:打电话的客户类(初步设计为包含客户名字和客户等级);服务人员(一个抽象基类+接线员、经理、主管三个继承类,初步设计为包含接电话服务,后续准备加上接电话者工号,是否需要...原创 2019-02-23 21:50:56 · 478 阅读 · 1 评论 -
每日一题--两个栈实现一个队列(Google推荐面试书--Cracking the Coding Interview)
题目原文:Implement a StackQueue class which implements a queue using two stacks.译文:使用两个栈实现一个队列StackQueue。分析这里代码设计两个栈最大长度等长,当然也可以不等长;将两个栈功能上划分为一个负责入栈(m_sin),一个负责出栈(m_sout);入队列时,直接将元素压入m_sin,当m_s...原创 2019-02-27 16:03:29 · 183 阅读 · 0 评论 -
每日一题--比较两个字符串是否为变位词(Cracking the Coding Interview)
题目Write a method to decide if two strings are anagrams or not.判断两个字符串是否是变位词(即两个字符串组成的各个字符个数完全相同但组成顺序不完全相同,eg.‘abcb’和’acbb’)。思路思路一:先比较两字符串长度是否相同、组成是否不完全相同(O(n)),再将两字符串按照字符表的顺序进行排序,比较排序后两字符串是否相同(...原创 2019-02-21 09:36:49 · 446 阅读 · 0 评论