好消息好消息,最后拿到了京东的offer,开心,多谢baifeng&他的朋友。
天津的高楼不多,但是是刚刚好的感觉。 ——端午回家的新感觉
最后一次更新,此篇完结。
真的每次都是拖到面试前一天才进行上一次面试的整理,百度挂了挂了,很难受,上星期二知道的消息,然后就郁郁寡欢一下午,晚上就决定去北京浪荡4天,现在收拾好心情,重新开始寻找暑期实习的征程,离7月还有不到20天,加上临近期末,真的忙的滴溜溜的转,另外今天收到了杭州的一家公司的offer,公司不大,考虑到杭州路途遥远,还在犹豫当中,20号之前在做决定吧,看看这周面试怎么样再说。明天是京东金融,已经没了之前的锐气,感觉已经平常心了,今晚在准备准备吧,嘻嘻~
哎,又到了不得已才整理心路历程的时候了,明天百度二面,心里发慌,怵的不行,也不知从何看起,基本算法题懒得看,机器学习算法又看不进去,思来想去还是先把之前面试的问题回顾一下,万一面试官在问我呢,嘿嘿
哎呀我的妈,一上来就要远程监控我手写算法题,题目如下,写的非常不好,主题思路有,但是没有考虑周全,最后面试官想和我一起写,被我拒绝了,我觉得给我半天也不一定能想出来。
给出一个五位阿拉伯数字,请写出它的中文读法,如:
12345 —> 一万两千三百四十五
2019年3月13日更新:终于还是把这个坑填上了!!!!偶也!!!
package algorithm;
import java.util.*;
public class Solution {
static char[] numArr = {'零','一','二','三','四','五','六','七','八','九'};
static String[] unitArr = {"","十","百","千","万"};
public static String numToChinese(int num) {
char[] newNum = String.valueOf(num).toCharArray();
int len = newNum.length;
StringBuilder res = new StringBuilder();
for(int i=0;i<len;i++) {
int temp = Integer.parseInt(String.valueOf(newNum[i]));
boolean zeroFlag = temp==0 ? true : false;
if(zeroFlag) {
while(i<len-1 && newNum[i+1]=='0')
i++;
if(i!=len-1) {
res.append(numArr[0]);
}
}else {
res.append(numArr[temp]);
res.append(unitArr[len-i-1]);
}
}
return res.toString();
}
public static void main(String[] args) {
System.out.print(numToChinese(12345));
System.out.print("\n");
System.out.print(numToChinese(10000));
System.out.print("\n");
System.out.print(numToChinese(10001));
System.out.print("\n");
System.out.print(numToChinese(10100));
System.out.print("\n");
System.out.print(numToChinese(10101));
}
}
之前我舍友还说我的寒假实习没有什么卵用,但是以目前的形势来看,有总比没有强,面试的时候至少不会那么尴尬了,还可以风生水起的聊点东西,目前来看的弱势就是项目没落地,没法实际展示。。。。
这一块的回答就略显尴尬,算法没分清楚,实际我用的是TF-IDF算法,现在补充词袋模型的基础知识
词集与词袋模型
这个算法的主要作用也就是对文本做单词切分,有点从一篇文章里提取关键词这种意思,旨在用向量来描述文本的主要内容,其中包含了词集与词袋两种。
词集模型:单词构成的集合,集合中每个元素只有一个,即词集中的每个单词都只有一个。
词袋模型:如果一个单词在文档中出现不止一次,就统计其出现的次数,词袋在词集的基础上加入了频率这个维度,使统计拥有更好的效果,通常我们在应用中都选用词袋模型。
转自: http://www.cnblogs.com/CheeseZH/
目前,构造SVM多类分类器的方法主要有两类
(1)直接法,直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该最优化问题“一次性”实现多类分类。这种方法看似简单,但其计算复杂度比较高,实现起来比较困难,只适合用于小型问题中;
(2)间接法,主要是通过组合多个二分类器来实现多分类器的构造,常见的方法有one-against-one和one-against-all两种。
标准答案:一对一法(one-versus-one,简称OVO SVMs或者pairwise)
其做法是在任意两类样本之间设计一个SVM,因此k个类别的样本就需要设计k(k-1)/2个SVM。当对一个未知样本进行分类时,最后得票最多的类别即为该未知样本的类别。
Libsvm中的多类分类就是根据这个方法实现的。
其它的三种方法,贴出来即可。
SVM支持向量机(英文全称:support vector machine)是一个分类算法, 通过找到一个分类平面, 将数据分隔在平面两侧, 从而达到分类的目的。
支持向量本质是向量,而这些向量却起着很重要的作用,如果做分类,他们就是离分界线最近的向量。也就是说分界面是靠这些向量确定的,他们支撑着分类面。(通俗回答)
SVM寻找最小margin的两个平行超平面以区分样本类别。三维空间中,这两个超平面最少可由特征空间中的三个特征向量唯一确定。这三个特征向量支撑了这两个超平面,作为支持向量,故SVM称作支持向量机.(高端回答)
间距(margin),就是你找到的那条线h,和贴它最近的那个点的距离,这种点我们也称它为支持向量,(比如图中贴近线的圈圈和方块),所有贴近边际线的都是支持向量。
机器学习岗位面试问题汇总 之 SVM
这个小同学总结的很到位,但是没有答案,可以用来整理思路
SVM面试题
我也不打算看别的了,SVM就看以上两个就好了
能解决啊,利用核函数,参考理解SVM(二)——线性不可分的情况
非线性可分的情况普遍存在,我觉得我的文本分类应该是线性不可分的吧。。。
- 特征如果选得好,大多数的数据都是线性可分的。判断是否线性可分最直观的方法就是用统计工具画图。如果线性不可分的话除非你清楚得知道映射到哪个维度就可以线性可分,不然的话最好选取高斯核函数,把目标空间映射到无穷维,再慢慢调参数
- 检查凸包(convex hull)是否相交。
我感觉彻底凉了,然后就给面试官瞎聊,聊了聊给我的建议什么的
主要就是叮嘱我不要看很多书,挑一本精读,也不要把注意力过分关注于数学推导,重理解,猫眼面试就这么愉快的凉掉了。。。
HR提前打电话问了下实习时间,然后说短期的对基础要求比较高,笔试成绩要求4分才可以,长期的3.5即可(估计是5分制吧)
三道算法题,感觉还挺难的,摆脱别人帮忙写了,然后就凉掉了,就这么凉掉了,
以后不好好写算法题,我就是猪!!!
后面的自由问问题环节了解到这是度蜜部门,智能音响产品和天猫精灵类似。问的比较全面,面试官非常nice,nice到我都不好意思了,全程笑嘻嘻~昨晚微信咨询,确定了二面的时间,还是技术面。。。
主体思路:
1、把英文文章的每个单词放到列表里,并统计列表长度;
2、遍历列表,对每个单词出现的次数进行统计,并将结果存储在字典中;
3、利用步骤1中获得的列表长度,求出每个单词出现的频率,并将结果存储在频率字典中;
4、以字典键值对的“值”为标准,对字典进行排序,输出结果(也可利用切片输出频率最大或最小的特定几个,因为经过排序sorted()函数处理后,单词及其频率信息已经存储在元组中,所有元组再组成列表。)
我还提了一下可以直接调用jieba分词的统计词频功能,用过就是不一样,呵呵
这块难不倒我,考研的付出是有回报的,介绍了一大串,很满意~
1.先从数列中取出一个数作为基准数,记为x。
2.分区过程,将不小于x的数全放到它的右边,不大于x的数全放到它的左边。(这样key的位置左边的没有大于key的,右边的没有小于key的,只需对左右区间排序即可)
3.再对左右区间重复第二步,直到各区间只有一个数
以每一次划分的pivot为中心,左边的都小于pivot,右边都大于它
快些选一堆都是不稳定的哦
举个栗子证明一下,原来王道中有讲过,所以印象很深刻
比如2,1,1(2)三个数做快速排序,结束后数列为1(2),1,2
相对位置发生了变化
这就非常简单了
我选用的筛法,写的还可以,后面面试官自己也搞不清这个代码写的有没有问题,就问我时间、空间复杂度还有没有改进的地方,可以在那里进行优化。
可改进的地方:
import java.util.Scanner;
public class ScannerPrimeNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
boolean[] bs = new boolean[n];
for (int i = 2; i < bs.length; i++) {
for (int j = i + 1; j < bs.length; j++) {
if (j % i == 0) {
bs[j] = true;
}
}
}
for (int i = 2; i < bs.length; i++) {
if (bs[i] == false) {
System.out.println(i);
}
}
}
}
这个没回答出来。。。。答案见下面
栈溢出就是缓冲区溢出的一种。 由于缓冲区溢出而使得有用的存储单元被改写,往往会引发不可预料的后果。程序在运行过程中,为了临时存取数据的需要,一般都要分配一些内存空间,通常称这些空间为缓冲区。如果向缓冲区中写入超过其本身长度的数据,以致于缓冲区无法容纳,就会造成缓冲区以外的存储单元被改写,这种现象就称为缓冲区溢出。缓冲区长度一般与用户自己定义的缓冲变量的类型有关。
栈溢出几种情况:
一、局部数组过大。当函数内部的数组过大时,有可能导致堆栈溢出。
二、递归调用层次太多。递归函数在运行时会执行压栈操作,当压栈次数太多时,也会导致堆栈溢出。(比如:在Python中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。)
三、指针或数组越界。这种情况最常见,例如进行字符串拷贝,或处理用户输入等等。
了解基础的自然语言技术,比如正则,分词,词向量,语言模型
手贱写了这么一句,然后面试官问了我几个问题就完全暴露了我的真面目:
正则匹配咯
在自然语言处理任务中,词在计算机中表示通常有两种表示方式:one-hot representation和distribution representation。
离散表示(one-hot representation)
传统的基于规则或基于统计的自然语义处理方法将单词看作一个原子符号
被称作one-hot representation。one-hot representation把每个词表示为一个长向量。这个向量的维度是词表大小,向量中只有一个维度的值为1,其余维度为0,这个维度就代表了当前的词。
例如:
苹果 [0,0,0,1,0,0,0,0,0,……]
one-hot representation相当于给每个词分配一个id,这就导致这种表示方式不能展示词与词之间的关系。另外,one-hot representation将会导致特征空间非常大,但也带来一个好处,就是在高维空间中,很多应用任务线性可分。
分布式表示(distribution representation)
word embedding指的是将词转化成一种分布式表示,又称词向量。分布
式表示将词表示成一个定长的连续的稠密向量。
语言模型是什么?
语言模型就是用来计算一个句子的概率的模型,即P(W1,W2,…Wk)。
利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。
再举一个机器翻译的例子,给定一个汉语句子为李明正在家里看电视,可以翻译为Li Ming is watching TV at home、Li Ming at home is watching TV、等等,同样根据语言模型,我们知道前者的概率大于后者,所以翻译成前者比较合理。
常见的方法有n-gram模型方法、决策树方法、最大熵模型方法、最大熵马尔科夫模型方法、条件随机域方法、神经网络方法,等等。
参考SVM和LR的区别
第一,LR和SVM都是分类算法
第二,如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的
第三,LR和SVM都是监督学习算法
第四,LR和SVM都是判别模型
第五,LR和SVM在学术界和工业界都广为人知并且应用广泛
第一,本质上是其loss function不同:逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值;支持向量机基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面
第二,支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用)
第三,在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法
第四,线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响
第五,SVM的损失函数就自带正则!!!(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因!!!而LR必须另外在损失函数上添加正则项!!!
失败在推荐系统上了,有点难过~
本来约的视频面试,结果可能面试官觉得比较麻烦就弄成了电话面试,时间不长,总体来说面试官要求比较严格,问的机器学习算法也不仅限于你项目中用过的,注重算法的理解,不能只是调用库跑一下模型,调个参数这种程度。面的不怎么好,实话说也是这几次面试中面的最不好的一次。
这一开始就整个技术栈装逼就给了我个蒙蔽。。
IT术语,某项工作或某个职位需要掌握的一系列技能组合的统称。technology stack 技术栈一般来说是指将N种技术互相组合在一起(N>1),作为一个有机的整体来实现某种目的。也可以指掌握这些技术以及配合使用的经验。
又学了个新的词汇。。。
你简历上面写着熟悉python,你使用的是什么版本的呢?熟悉哪些python框架呢
这个问题我觉得他把框架和常用模块弄混了。。。。
常用框架和模块
python如何定义一个函数
只说出了def定义函数,把lambda匿名函数给忘记了。。。。
定义函数的五种形式
python如何操纵文件流呢?给你个excel表格如何进行读取呢?
感觉很重视语言基础???问了好多,这个其实也不是很难。。。贴个答案
python读取文件
读取excel表格使用pandas库啊,哈哈
python内存管理
这个完全是没有在意过的事情啊。
这次学习下 python内存机制
问题记不清了,大概问的都不怎么会,很尴尬,只记得几个关键词
贝叶斯、SVM、最优化、cost function、梯度下降法
果然是很喜欢问快排哦,掌握下面这个图就不怕了
离散序列实质就是原序列每个元素用它的名次代替(相同的元素名次相同),离散化就是要得到序列的名次数组。
序列的离散化
这个问题感觉像是以前学的信号系统,最近完全没有接触过,也不知道他为什么要问我。。。
总是呢,一面后面就很尴尬,他提问题我答不上来,他叹气,我沮丧,越面越不爽,哎。。
专程去了趟北京总部,在楼下买了一份价值10元昂贵的烤冷面后,悠闲的吃完又补了个口红,照了照镜子,然后就跑到17楼等待面试官到来。
具体问了哪些问题就不说了,一般到二面也不会问很多技术问题,或者是CTO来了笼统的问问,但是一般不会像一面那么细致,紧张了一两分钟以后就语气就很平稳了,就开始兜售自己,要明白面试官想要什么,回答尽量全面,面试官对我比较感兴趣的一点就是可能我比较自来熟,很快就进入状态了,其实和日常差别还挺大的,我还是比较怕生的,请叫我社恐小明酱,嘿嘿。只面了20分钟,然后最后问了部门是做什么的,对我的整体感觉,面试官就走了,让我坐在此地不要动,他去。。。当然不是买橘子啦,他是去叫人事去了。
确定实习时间,薪酬,岗位当时没确定,后来下午才通知的,算法岗没去成,给的客户端研发实习岗位,也还行吧,比较满意了,大公司也很人性化,免费班车,加班餐,免费健身房等等,很舒服。
寻找暑期的奖金一个月生活就这么结束了,坦白讲,这是我半年来成长最快的一段时间,也经常睡不着觉,也经常沉浸幻想,实习只是临时起意,之前工作的领导劝我别荒废了暑假,尽量找份实习,也就有了后来的经历,也多谢他给我改简历,嘿嘿。。不嫌弃让我在宿舍进行视频面试的可爱的舍友们,帮我内推的阿铭,鼓励我的爸妈还有姐姐,我发脾气还给我顺毛的朔朔。
人生不负我。
完。