- 博客(59)
- 资源 (3)
- 收藏
- 关注
原创 设计模式—工厂模式(Factory Method)
动机(Motivation)在软件系统中,经常面临着创建对象的工作;由于需求的变化,需要创建的对象的具体类型经常变化。如何应对这种变化?如何绕过常规的对象创建方法(new),提供一种“封装机制”来避免客户程序和这种“具体对象创建工作”的紧耦合?模式定义定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使得一个类的实例化延迟(目的:解耦,手段:虚函数)到子...
2018-10-26 14:25:28
295
1
原创 设计模式—Observer/Event(观察者模式)
动机(Motivation)在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” ——一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。模式定义定义对象间的一种一对多(变化)的依赖关系,以便当一个...
2018-10-26 09:43:51
924
原创 设计模式—Strategy(策略模式)
动机(Motivation)在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题?模式定义定义一系列算法,把它们一个个封装起来,并且使它们可互相替换(变化)。该模式使得算法可独立于使用它的客户程序(稳定...
2018-10-25 20:26:46
195
原创 设计模式—Template Method(模板方法)
动机(Motivation)在软件构建过程中,对于某一项任务,它常常有稳定的整体操作结构,但各个子步骤却有很多改变的需求,或者由于固有的原因(比如框架与应用之间的关系)而无法和任务的整体结构同时实现。如何在确定稳定操作结构的前提下,来灵活应对各个子步骤的变化或者晚期实现需求?模式定义定义一个操作中的算法的骨架 (稳定) ,而将一些步骤延迟 (变化) 到子类中。Template Met...
2018-10-25 17:32:59
379
1
原创 C++设计模式
什么是设计模式“每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动”。——Christopher Alexander深入理解面向对象向下:深入理解三大面向对象机制封装,隐藏内部实现继承,复用现有代码多态,改写对象行为向上: 深刻把握面向对象机制所带来的抽象意义,理解如何使用这些机制来表达现实世界,...
2018-10-25 17:32:40
269
原创 RELU是分段线性函数,怎么实现非线性呢?
ReLu虽然在大于0的区间是线性的,在小于等于0的部分也是线性的,但是它整体不是线性的,因为不是一条直线。多个线性操作的组合也是一个线性操作,没有非线性激活,就相当于只有一个超平面去划分空间。但是ReLu是非线性的,效果类似于划分和折叠空间,组合多个(线性操作 + ReLu)就可以任意的划分空间。 对于浅层的机器学习,比如经典的三层神经网络,用它作为激活函数的话,那表现出来的性质肯定是线...
2018-08-20 22:28:54
11231
1
原创 CARLA自动驾驶模拟器操作
一、运行模拟器1. 不带参数运行此脚本以使用默认设置以独立模式启动CARLA模拟器$ ./CarlaUE4.shWASD键在城市中驾驶,而Q则用于切换倒档2.目前有两种方案,Town01和Town02。您现在可能想看看Town02,您可以通过运行脚本来实现$ ./CarlaUE4.sh /Game/Maps/Town023.在启动模拟时,可以控制所有参数,例如其他车辆的...
2018-07-30 20:46:29
8589
1
原创 机器学习算法工程师面试问题
一、OPPO提前批(岗位:机器学习算法工程师)1.1 一面(通过) 2018.07.21手写二叉树前序遍历 剑指offer青蛙跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法? 我:采用递归的方式做,f(n) = f(n-1) + f(n-2) n>=3; f(1) = 1; f(2) = 2; 面试官:如果不利用...
2018-07-22 22:11:22
2147
原创 字符串转换成整数
一、题目 请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。二、解法需要考虑的因素:数据的上下溢出 空字符串 有无正负号 字符串中包含不是数字的字符class Solution {public: int StrToInt(string str) { if(str.empty()) ...
2018-07-17 19:04:00
255
原创 面试题28:翻转字符串
一、题目 题目描述:单词翻转:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变,句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如,输入“I am a student.”,则输出“student. a am I”二、解法 思路:第一步翻转句子中所有的字符串,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序。/...
2018-07-15 13:02:44
179
原创 哈希表
哈希表查找算法的实现下面实现了最简单的哈希表查找过程:定义一个哈希表的结构以及一些相关的常数,其中HashTable就是哈希表的结构,结构中elem为一个动态数组有了结构的定义,可以对哈希表进行初始化为了插入时计算地址,需要定义哈希函数,哈希函数此处为“除留余数法”此处解决冲突使用的方法是“开放定址法”,线性探测进行重新寻址,也可以更改为链地址法等其他解决冲突的方法#include "stdio....
2018-07-15 11:24:41
175
原创 平衡二叉树的判定
一、题目 题目描述:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。二、解法2.1 方法一 思路:在遍历树的每一个节点的时候,调用TreeDepth函数得到它的左右子树的深度,如果每个节点的左右子树的深度相差都不超过1,那么按照定义它就是一棵平衡二叉树。int TreeDepth(const Binary...
2018-07-14 20:45:39
1415
原创 面试题55:二叉树的深度
一、题目 输入一棵二叉树的根结点,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如下图中的二叉树的深度为4,因为它从根结点到叶结点最长的路径包含4个结点(从根结点1开始,经过结点2和结点5,最终到达叶结点7)。二、解法思路: ①如果一棵树只有一个结点,它的深度为1。 ②如果根结点只有左子树而没有右子树,那么树的深度应该是...
2018-07-14 20:09:59
208
原创 面试题53:在排序数组中查找数字
一、题目 统计一个数字在排序数组中出现的次数,例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4.二、解法思路:既然输入的数组是排序的,那么我们自然能想到用二分查找算法,如何高效的利用二分查找,可以分别利用二分查找找到第一个k和最后一个k。class Solution {public: int GetNumberOfK(vect...
2018-07-14 19:44:01
351
原创 面试题52:两个链表的第一个公共节点
一、题目 输入两个链表,找出它们的第一个公共节点。二、解法 思路:假设链表1比链表2长。 则从两个链表的头结点开始遍历,前提是先让较长的链表前进(length1-length2)个节点,然后同时开始遍历,它们可以同时到达第一个公共节点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : ...
2018-07-14 17:06:35
144
原创 面试题51:数组中的逆序对
一、题目 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6)(7,5)(7,4)(6,4)(5,4)二、解法 看到这道题目,第一反应是顺序扫描整个数组,没扫描到一个数字,逐个比较该数字和它后面数字的大小,如果后面的数字比它小,则这两个数字就组成...
2018-07-14 17:02:52
186
原创 面试题50:第一个只出现一次的字符
一、题目在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出“b”。二、解法(hashTable) 思路:为了解决这个问题,可以定义哈希表的KEY是字符,而Value是该字符出现的次数,同时我们还需要从头开始扫面字符串两次,第一次扫描字符串时,每扫描到一个字符,就在哈希表对应项中把次数加1。接下来第二次扫描时,没扫到一个字符,就能在哈希表中得到该字符出现的次数。这样,第...
2018-07-14 15:58:58
193
原创 面试题48:最长不含重复字符的子字符串
一、题目 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含从'a'到'z'的字符。例如,在字符串“arabcacfr”中,最长的不含重复字符的子字符串是“acfr”,长度为4.二、解法 思路:利用动态规划算法,首先定义函数f(i)表示以第i个字符结尾的不包含重复字符的子字符串的最长长度。如果第i个字符之前没有出现过,那么f(i) = f(...
2018-07-14 11:27:51
464
原创 42. 连续子数组的最大和
一、题目 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。你会不会被他忽悠住?(子向...
2018-07-02 22:25:57
151
原创 面试题41:数据流中的中位数
一、题目 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。二、解法数据结构插入的时间复杂度得到中位数的时间按复杂度没有排序的数组O(1)O(n)排序的数组O(n)O(1)排序的链表O(n)O(1)二叉搜索树平均O(logn),最差O(n)平均O(l...
2018-07-02 21:08:02
235
原创 面试题40:最小的K个数
一、题目 输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8 这8个数字,则最小的4个数字是1、2、3、4。二、解法 分析:这道题最简单的思路莫过于把输入的n个整数排序,排序之后位于最前面的k个数就是最小的k个数,这种思路的时间按复杂度是O(nlogn).2.1 方法一:时间复杂度为O(n)的算法,只有当我们可以修改输入的数组时可用 思路:从解决面试题...
2018-07-02 20:00:43
182
原创 面试题39:数组中出现次数超过一半的数字
一、题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。二、解法2.1 方法一:基于Partition函数的时间复杂度为O(n)的算法class Solution {public: int Partition(vecto...
2018-07-02 19:11:13
125
原创 面试题38:字符串的排列
一、题目 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。二、解法class Solution {public: vector<string> Permutation(string str) { vector<string...
2018-06-29 21:31:00
241
原创 面试题35:复杂链表的复制
一、题目 复杂链表的复制:请实现函数ComplexListNode* Clone(ComplexListNode* pHead),复制一个复杂链表。在复杂链表中,每个结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling 指向链表中的任意结点或者nullptr。struct ComplexListNode{ int m_n...
2018-06-29 19:32:50
135
原创 面试题34:二叉树中和为某一值的路径
一、题目 输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二、解法...
2018-06-29 16:20:35
212
原创 面试题33:二叉搜索树的后序遍历序列
一、题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 例如:输入数组{5, 7, 6, 9, 11, 10, 8},则返回true,因为这个整数序列如图二叉搜索树的后序遍历结果。如果输入的数组是{7, 4, 6, 5},则由于没有哪棵二叉搜索树的后序遍历结果是这个序列,因此返回fa...
2018-06-27 16:55:36
106
原创 面试题32:从上到下打印二叉树
一、 题目 从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。如图所示的二叉树,依次打印出8,6,10,5,7,9,11.二、解法表. 按层打印图中二叉树的过程步骤 操作队列1打印节点8节点6、节点102打印节点8节点10、节点5、节点73打印节点8节点5、节点7、节点9、节点114打印节点8节点7、节点9、节点115打印节点8节点9、节点116打印节点8节点117打印...
2018-06-27 15:45:50
139
原创 面试题31:栈的压入、弹出序列
一、题目 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)二、解法 思路:总结入栈、出栈的过程,我们可以找到判断一个序列是不是栈的弹出序...
2018-06-27 14:43:54
105
原创 面试题30:包含min函数的栈
一、题目 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。二、解法思路:利用一个辅助栈来存放最小值 栈 3,4,2,1 辅助栈 3,3,2,1 每入栈一次,就与辅助栈顶比较大小,如果小就入栈,如果大就入栈当前的辅助栈顶;当出栈时,辅助栈也要出栈 这种做法...
2018-06-27 10:55:41
131
原创 面试题29:顺时针打印矩阵
一、题目 顺时针打印矩阵:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。如下图的矩阵顺序打印的数字为:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10 1 2 3 4 ...
2018-06-27 10:31:32
160
原创 面试题28:对称的二叉树
一、题目 对称的二叉树:请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。如下图:二、解法 思路:我们可以通过比较二叉树的前序遍历序列和对称的前序遍历序列来判断二叉树是不是对称的,如果两个的序列是一样的,那么二叉树就是对称的。#include <cstdio>#include <iostream>using ...
2018-06-27 09:51:33
131
原创 面试题25:合并两个排序的链表(C++/Python)
一、题目 输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链表3所示。二、解法(递归)#include <cstdio>#include <iostream>using namespace std;struct ListNode{ int m_nValu...
2018-06-26 15:45:25
242
原创 面试题24:反转链表
一、题目 反转链表:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。二、解法 分析: 为了正确的反转一个链表,需要调整链表中指针的方向,如下图,我们在调整i的next指针时,除了需要知道节点i本身,还需要知道i的前一个节点h,因为我们需要把i的next指向节点h,同时,我们还需要先保存i的下一个节点j,以防止链表断开,因此,相应的我们需要定义3个指针,分别指向...
2018-06-26 11:10:33
155
原创 面试题23:链表中环的入口节点
一、题目 一个链表中包含环,如何找出环的入口结点?例如,在图的链表中,环的入口结点是结点3。图. 节点3是链表环的入口节点二、解法 分析:解决这个问题第一步是如何确定一个链表中包含环。我们可以定义两个指针,同时从链表头结点出发,一个指针一次走一步,另一个指针一次走两步。如果走的快的指针追上了走得慢的指针,那么链表就包含环;如果走的快的指针走到了链表的末尾都没有追上第一个指针,那么链表...
2018-06-26 10:18:07
125
原创 面试题22:链表中倒数第k个节点
一、题目 链表中倒数第k个节点: 输入一个链表,输出该链表中倒数第k个结点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。例如一个链表有6个结点,从头结点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个结点是值为4的结点。二、解法 思路:定义两个指针,第一个指针从连标点的头指针开始遍历,向前走k-1步,第二个指针保持不动;从第k步开始,第二...
2018-06-26 08:29:28
256
原创 面试题21:调整数组顺序使奇数位于偶数前面
一、题目 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。二、解法2.1 方法一:最简单思路 分析:如果不考虑时间复杂度和空间复杂度,最简单的思路就是从头扫描这个数组,将奇数放到一个新的数组中,将偶数放在另一个数组中。最后把两个数组拼接到一起。以下用Python实现:class Solution: def ...
2018-06-25 10:48:03
192
原创 面试题20:表示数值的字符串
一、题目 请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串“+100”、“5e2”、“-123”、“3.1416”及“-1E-16”都表示数值,但“12e”、“1a3.14”、“1.2.3”、“+-5”及“12e+5.4”都不是。二、解法#include <cstdio>#include <iostream>using namesp...
2018-06-25 10:18:24
193
原创 面试题19:正则表达式匹配
一、题目 请实现一个函数用来匹配包含'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"及"ab*a"均不匹配。二、解法1. 当模式中的第二个字符不是“*”时:如果字符串第一个字符和模式中的第一个字符相...
2018-06-25 09:23:39
123
原创 面试题18_2:删除链表中重复的节点
一、题目 删除链表中重复的节点:在一个排序的链表中,如何删除重复的结点?例如,在图(a)中重复 结点被删除之后,链表如图3.4(b)所示。 (a). 1->2->3->3->4->4->5 ...
2018-06-24 21:33:22
172
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人