知乎連續(xù)面了三面蛤虐,第三面掛了,不過(guò)還是學(xué)習(xí)到了不少的東西摩泪。
一面:
1、介紹項(xiàng)目
2劫谅、一個(gè)數(shù)組见坑,所有數(shù)組都出現(xiàn)了兩次嚷掠,只有一個(gè)數(shù)出現(xiàn)了一次,返回這個(gè)數(shù)
這個(gè)題很簡(jiǎn)單荞驴,兩個(gè)相同的數(shù)的異或是0不皆,因此所有數(shù)求異或,剩下的數(shù)即為我們要求的數(shù)熊楼。
class Solution {
public int singleNumber(int[] nums) {
int res = 0;
for(int i=0;i<nums.length;i++)
res ^= nums[I];
return res;
}
}
3霹娄、一個(gè)數(shù)組,一個(gè)數(shù)出現(xiàn)了超過(guò)一半次數(shù)鲫骗,返回這個(gè)數(shù)
這里用到的就是兩兩消除的思路犬耻。
class Solution {
public int majorityElement(int[] nums) {
if(nums==null || nums.length==0)
return -1;
int res = nums[0];
int count = 1;
for(int i=1;i<nums.length;i++){
if(res == nums[I])
count++;
else{
if(count==0){
count ++;
res = nums[I];
}
else
count--;
}
}
return res;
}
}
4、將除法的結(jié)果用字符串返回执泰,如果能夠除盡枕磁,則返回相除的結(jié)果,如果不能除盡术吝,則無(wú)限循環(huán)部分用[]標(biāo)記计济。
這里我采用了隊(duì)列和Map的做法,使用map記錄每個(gè)除數(shù)出現(xiàn)的位置排苍,如果出現(xiàn)了相同的除數(shù)沦寂,則表明出現(xiàn)了無(wú)限循環(huán)部分。如果除數(shù)變成了0淘衙,則說(shuō)明除盡了传藏。
import java.util.*;
public class DivideTwoInteger {
public static void divide(int p1,int p2){
Queue<Integer> queue = new LinkedList<Integer>();
int intPart = p1 / p2;
int reminder = p1 % p2;
if(reminder == 0){
System.out.println("" + intPart);
return;
}
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
map.put(reminder,0);
int index = 0;
while(true){
queue.offer(reminder * 10 / p2);
reminder = reminder * 10 % p2;
if(map.containsKey(reminder) || reminder==0)
break;
else
map.put(reminder,++index);
}
StringBuilder stb = new StringBuilder();
stb.append(intPart + "");
stb.append(".");
if(reminder == 0){
while(!queue.isEmpty())
stb.append(queue.poll() + "");
System.out.println(stb.toString());
}
else{
int pos = map.get(reminder);
index = 0;
while(index < pos)
stb.append(queue.poll() + "");
stb.append("[");
while(!queue.isEmpty())
stb.append(queue.poll() + "");
stb.append("]");
System.out.println(stb.toString());
}
}
public static void main(String[] args){
divide(1,3);
divide(100,3);
divide(6,3);
divide(10,4);
}
}
5、介紹下DeepFM
二面:
1幔翰、介紹項(xiàng)目
2漩氨、word2vec的原理簡(jiǎn)單介紹下
有關(guān)word2vec的原理,大家可以看https://blog.csdn.net/itplus/article/details/37969519
3遗增、DeepFM介紹下
4叫惊、FM推導(dǎo)
5、數(shù)組排序做修,假設(shè)數(shù)組排序后的位次和排序前的位次絕對(duì)值差值小于K霍狰,有什么比快排好的算法?
堆排序饰及,建堆的過(guò)程是KlogK蔗坯。我開(kāi)始說(shuō)用堆排序,先將數(shù)組的前K+1個(gè)元素建堆燎含,然后每次出去一個(gè)進(jìn)來(lái)一個(gè)宾濒,完成排序。面試官問(wèn)我屏箍,這樣做是有序的么绘梦。我一開(kāi)始說(shuō)不一定橘忱,但仔細(xì)想想,一定是有序的卸奉。我們來(lái)分析一下钝诚。
因?yàn)榕判蚯昂团判蚝螅粋€(gè)數(shù)字的索引之差小于等于K榄棵。假設(shè)K=3凝颇,也就是說(shuō),索引為2的數(shù)疹鳄,在排序后拧略,最大位置不超過(guò)5。再假設(shè)我們當(dāng)前找到的是排序后索引為2的數(shù)尚辑,且后面有一個(gè)數(shù)比這個(gè)要小辑鲤。由于這個(gè)數(shù)不在堆中,因此這個(gè)數(shù)的排序前索引一定大于5杠茬,這與假設(shè)相矛盾月褥。因此用堆排序一定能保證數(shù)組有序。
6瓢喉、樹(shù)中兩個(gè)節(jié)點(diǎn)的第一個(gè)的公共祖先宁赤。
這個(gè)題Leetcode上有原題:https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/
代碼貼出來(lái):
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null || root == p || root== q)
return root;
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left!=null && right!=null) return root;
return left !=null?left:right!=null?right:null;
}
}
三面:
1、介紹下項(xiàng)目
2栓票、word2vec里面的層次索引
3决左、boosting和bagging的區(qū)別?
1)樣本選擇上:
Bagging:訓(xùn)練集是在原始集中有放回選取的走贪,從原始集中選出的各輪訓(xùn)練集之間是獨(dú)立的.
Boosting:每一輪的訓(xùn)練集不變佛猛,只是訓(xùn)練集中每個(gè)樣例在分類(lèi)器中的權(quán)重發(fā)生變化.而權(quán)值是根據(jù)上一輪的分類(lèi)結(jié)果進(jìn)行調(diào)整.
2)樣例權(quán)重:
Bagging:使用均勻取樣,每個(gè)樣例的權(quán)重相等
Boosting:根據(jù)錯(cuò)誤率不斷調(diào)整樣例的權(quán)值坠狡,錯(cuò)誤率越大則權(quán)重越大.
3)預(yù)測(cè)函數(shù):
Bagging:所有預(yù)測(cè)函數(shù)的權(quán)重相等.
Boosting:每個(gè)弱分類(lèi)器都有相應(yīng)的權(quán)重继找,對(duì)于分類(lèi)誤差小的分類(lèi)器會(huì)有更大的權(quán)重.
4)并行計(jì)算:
Bagging:各個(gè)預(yù)測(cè)函數(shù)可以并行生成
Boosting:各個(gè)預(yù)測(cè)函數(shù)只能順序生成,因?yàn)楹笠粋€(gè)模型參數(shù)需要前一輪模型的結(jié)果.
4逃沿、bagging為什么能減小方差婴渡?
參考博客:https://blog.csdn.net/shenxiaoming77/article/details/53894973
可能不懂的地方看下面的公式就知道了:
5、交叉熵?fù)p失函數(shù)凯亮,0-1分類(lèi)的交叉熵?fù)p失函數(shù)的边臼。什么是凸函數(shù)?0-1分類(lèi)如果用平方損失為什么用交叉熵而不是平方損失假消?
這里我們只回答最后一個(gè)問(wèn)題柠并,也就是說(shuō)邏輯回歸為什么不用平方損失?有兩點(diǎn)原因:
1)平方損失函數(shù)非凸函數(shù)。為什么非凸臼予?凸函數(shù)二階導(dǎo)數(shù)大于等于0亿傅,證明一下即可。
2)但是會(huì)在h(wx)接近0和1的地方梯度很小瘟栖,不容易學(xué)習(xí)。
6谅阿、python里的gc和多線程半哟。
在Python中,為了解決內(nèi)存泄露問(wèn)題签餐,采用了對(duì)象引用計(jì)數(shù)寓涨,并基于引用計(jì)數(shù)實(shí)現(xiàn)自動(dòng)垃圾回收。