面經(jīng)1
- 給一個目標數(shù) t,找出數(shù)組中和為t的組合(集合)有多少?
這個是很典型的貪心算法問題,代碼如下
public class Mj1 {
//貪心算法,非最優(yōu)解
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()){
int n = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int target = sc.nextInt();
System.out.println(Arrays.toString(getTypes(arr,target)));
}
sc.close();
}
private static int[] getTypes(int[] arr, int target) {
int[] res = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
if(target>arr[i])
break;
}
int index = 0;
while (target>0&&index<arr.length){
if(target>=arr[index]){
target-=arr[index];
res[index]++;
}else
index++;
}
return res;
}
}
求集合的算法暫時還沒想到,如果可以重復使用某一個呢?求解~
- 面向?qū)ο蟮暮锰幒捅锥?/li>
好處:基本將繼承、封裝、多態(tài)講清楚就好
弊端·知乎
- JMM,volatile關(guān)鍵字及其使用場景
Http協(xié)議的get、post和delete區(qū)別。
Linux命令,怎么查看cpu使用情況,cpu load的值代表啥。
查看cpu使用情況:top、cat 和free cpu load的值代表cpu的利用率
- tcp-ip模型與osi模型的區(qū)別
面經(jīng)2
1.linux信號機制如何實現(xiàn)的?寫一下偽代碼?
解答:Linux信號(signal) 機制分析
2.電腦開機過程
解答:阮一峰:計算機是如何啟動的
3.printf是怎么實現(xiàn)的?
基本上倒著來說就是printf->sprintf->用戶級別的puts->sys_puts->puts->putchar方法
4.On求鏈表中間結(jié)點
維護兩個指針,一個每次走一步,一個每次走兩步,走的快的指向null的時候,此時慢的就處在mid節(jié)點。
public class Mj2 {
static class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
}
}
public ListNode getMid(ListNode head){
ListNode quick = head;
ListNode slow = head;
while (quick!=null){
if(quick.next!=null){
quick = quick.next.next;
}else {
break;
}
slow=slow.next;
}
return slow;
}
}
5.瀏覽器訪問meituan.com的過程?
1.在瀏覽器輸入meituan.com
2.DNS把meituan.com解析成IP,如果用戶輸入了端口號,則使用用戶輸入的端口號,否則使用默認的80端口。在解析過程中,DNS會首先通過緩存進行查找,依次按照瀏覽器緩存-操作系統(tǒng)緩存-路由器緩存-ISP DNS緩存的順序。如果緩存中都沒有記載相應(yīng)的IP地址,那么DNS服務(wù)器將按照根域-頂級域-二級域-…的順序進行遞歸查找,并返回查找結(jié)果。
3.瀏覽器向服務(wù)器發(fā)送HTTP請求
4.服務(wù)器返回一個永久重定向響應(yīng)(code:301),即把meituan.com重定向成www.meituan.com
5.瀏覽器申請連接重定向后的地址
6.服務(wù)器響應(yīng)請求,并開始向瀏覽器返回數(shù)據(jù),如果資源路徑不存在,那么會返回404錯誤
7.如果6中返回的是頁面,根據(jù)頁面的外鏈URL,再次進行獲取,然后瀏覽器根據(jù)資源類型進行網(wǎng)頁渲染,將網(wǎng)頁展示給用戶并響應(yīng)用戶的操作,在這個過程中操作是同步進行的。
6.socket是什么?端口是什么,兩者有什么關(guān)系
三者從本質(zhì)上來說沒有可比性,
socket則是對TCP/IP協(xié)議的封裝和應(yīng)用(程序員層面上)。
也可以說,TPC/IP協(xié)議是傳輸層協(xié)議,主要解決數(shù)據(jù)如何在網(wǎng)絡(luò)中傳輸,
而HTTP是應(yīng)用層協(xié)議,主要解決如何包裝數(shù)據(jù)。
關(guān)于TCP/IP和HTTP協(xié)議的關(guān)系,網(wǎng)絡(luò)有一段比較容易理解的介紹:
“我們在傳輸數(shù)據(jù)時,可以只使用(傳輸層)TCP/IP協(xié)議,但是那樣的話,如果沒有應(yīng)用層,便無法識別數(shù)據(jù)內(nèi)容。
如果想要使傳輸?shù)臄?shù)據(jù)有意義,則必須使用到應(yīng)用層協(xié)議。
應(yīng)用層協(xié)議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應(yīng)用層協(xié)議。
WEB使用HTTP協(xié)議作應(yīng)用層協(xié)議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協(xié)議將它發(fā)到網(wǎng)絡(luò)上。”
而我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協(xié)議的封裝,Socket本身并不是協(xié)議,而是一個調(diào)用接口(API)。
通過Socket,我們才能使用TCP/IP協(xié)議。
實際上,Socket跟TCP/IP協(xié)議沒有必然的聯(lián)系。
Socket編程接口在設(shè)計的時候,就希望也能適應(yīng)其他的網(wǎng)絡(luò)協(xié)議。
所以說,Socket的出現(xiàn)只是使得程序員更方便地使用TCP/IP協(xié)議棧而已,是對TCP/IP協(xié)議的抽象,
從而形成了我們知道的一些最基本的函數(shù)接口,比如create、listen、connect、accept、send、read和write等等。
網(wǎng)絡(luò)有一段關(guān)于socket和TCP/IP協(xié)議關(guān)系的說法比較容易理解:
“TCP/IP只是一個協(xié)議棧,就像操作系統(tǒng)的運行機制一樣,必須要具體實現(xiàn),同時還要提供對外的操作接口。
這個就像操作系統(tǒng)會提供標準的編程接口,比如win32編程接口一樣,
TCP/IP也要提供可供程序員做網(wǎng)絡(luò)開發(fā)所用的接口,這就是Socket編程接口?!?/p>
7.手寫代碼題:一個動態(tài)規(guī)劃,一個dfs(寫了很久。)
8.籠統(tǒng)問題
介紹下在頭條實習都干了什么項目中遇到的難點最近讀了什么技術(shù)書籍?我說了三本,面試官一本一本問,要求介紹具體內(nèi)容你大學期間自己做過的印象最深的一件事答:1、自己寫的ipl成功引導啟動了linux kernel2、修改linux0.11源碼,添加了兩個系統(tǒng)調(diào)用你對你的第一份工作有什么期望你有什么問題要問我?談?wù)勀愕穆殬I(yè)規(guī)劃,和最近在看哪方面的書?
面經(jīng)3
1.TCP的連接和斷開過程(這個比較基礎(chǔ)),深入問了為什么斷開的時候服務(wù)器端不是一次性向客戶端發(fā)完應(yīng)答,而是連續(xù)發(fā)兩次信息?(這個真心不會)
TCP的連接和斷開過程就是三次握手,四次揮手
2.數(shù)學題:0-9999中數(shù)字出現(xiàn)6的個數(shù),(每個數(shù)中出現(xiàn)多個6需要進行次數(shù)累加),要求不能通過編程。
總共有四位數(shù),每位數(shù)的可能分別有10種(0~9)。
每一個位,都會出現(xiàn)0-9的交替,實際上在出現(xiàn)6這個角度,各個位是一樣的。
現(xiàn)在假設(shè)個位固定為6,那么其他的位數(shù)的變化數(shù)量是10 * 10 * 10 = 1000種。
就是說數(shù)字6在個位出現(xiàn)的次數(shù)為1000。
以此類推,數(shù)字6在十位、百位、千位出現(xiàn)的次數(shù)也是1000。
故答案為 4 * 1000 = 4000
4.25匹馬選出跑的最快的3匹馬,最少需要多少次.
七次。思路&證明。
<step1>把25匹馬分為五組進行比賽,每一組都按成績編號,1>2>3>4>5??商蕴恳唤M的4,5,故現(xiàn)在還有15匹馬待選。 這樣已經(jīng)比賽5次。
<step2>把每一組的第一名挑選出來比賽,a1>b1>c1>d1>e1,則d,e組都可以淘汰?,F(xiàn)在還有九匹馬待選。這樣已經(jīng)比賽6次。
<step3> a123 b123 c123 由1和2中步驟知上表中a1一定最快,a2,b1可能可以競爭第二名的位置,a3,b2,c1可以競爭第三名,如此,其余的馬匹被淘汰。讓a2,b1,a3,b2,c1這5匹馬比賽即可確定第二名,第三名。
這樣一共比賽7次。
5.java基礎(chǔ) 垃圾回收機制,講一些算法
解答:java垃圾回收機制
6.hashMap與hashtable 還有并發(fā)集合
解答:徹底搞懂HashMap,HashTable,ConcurrentHashMap之關(guān)聯(lián).
7.http基礎(chǔ)(三次握手,代理,緩存機制,method)
Android相關(guān)面試題
鴻洋微信公眾號
1.java的數(shù)據(jù)類型
void byte short int long char float double boolean
2.重載和重寫的區(qū)別
重載
1.方法重載是讓類以統(tǒng)一的方式處理不同類型數(shù)據(jù)的一種手段,多個同名函數(shù)存在,具有不同的參數(shù)/類型,重載Overloading是java的一個類的多態(tài)性的一種體現(xiàn)。
2.java中方法的重載,就是在java的同一個類中,創(chuàng)建多個方法,他們具有相同的方法名,但是有不同的參數(shù)和不同的定義,調(diào)用方法時通過傳遞給他們不同的參數(shù)個數(shù)和參數(shù)類型來決定具體使用哪個方法,這個就是多態(tài)性。
- 重載的時候,方法名要一樣,但是參數(shù)類型和個數(shù)不一樣,返回值類型可以相同也可以不相同。無法以返回型別作為重載函數(shù)的區(qū)分標準.
重寫
1.父類與子類之間的多態(tài)性,對父類的函數(shù)進行重新定義。如果在子類中定義某方法與其父類有相同的名稱和參數(shù),我們說該方法被重寫 (Overriding)。在java中,子類可繼承父類中的方法,而不需要重新編寫相同的方法。但有時子類并不想原封不動地繼承父類的方法,而是想作一定的修改,這就需要采用方法的重寫。
方法重寫又稱方法覆蓋。
2.若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數(shù)表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關(guān)鍵字,該關(guān)鍵字引用了當前類的父類。
3.子類函數(shù)的訪問修飾權(quán)限不能少于父類的;
3.抽象類和接口的區(qū)別
4.final關(guān)鍵字可以修飾什么,作用什么
final關(guān)鍵字可以修飾java的類,方法,屬性
1.final修飾類,從而這個就不可以被繼承,例如String,StringBuffer或者System類
2.final修飾方法,這個方法不能被重寫,例如OIbject類的getClass方法
3.final修飾屬性,這個屬性就是一個常量,通常是大寫--即該變量不能使用默認初始化??梢燥@示的賦值,代碼塊,構(gòu)造器。
- java權(quán)限的四種不同
public protected private default 區(qū)別
類別 public protected default private 同一個類 √ √ √ √ 同一個包 √ √ √ 子類 √ √ 不同包
6.Android中Handler的作用?
實現(xiàn)異步的消息處理機制。包含線程隊列和消息隊列
1.運行在某個線程上,共享線程的消息隊列
2.接收消息、調(diào)用消息、派發(fā)消息和處理消息
3.實現(xiàn)消息的異步處理
具體內(nèi)容
7.Activity生命周期 和四種啟動方式
四種啟動模式的應(yīng)用,試舉例。
- Fragment的生命周期
更多可見洋神博客
9.listView優(yōu)化
- 重用convertView
- 使用ViewHolder
- 圖片三級緩存
- 監(jiān)聽滑動事件,滑動的時候不加載數(shù)據(jù)
- 開啟硬件加速
<activity android:hardwareAccelerated="true" ...>
10.Android內(nèi)存泄漏,舉個例子
Java內(nèi)存泄漏引起的主要原因:長生命周期的對象持有短生命周期對象的引用就很可能發(fā)生內(nèi)存泄漏
Java內(nèi)存分配策略:
靜態(tài)存儲區(qū):又稱方法區(qū),主要存儲全局變量和靜態(tài)變量,在整個程序運行期間都存在
棧區(qū):方法體的局部變量會在棧區(qū)創(chuàng)建空間,并在方法執(zhí)行結(jié)束后會自動釋放變量的空間和內(nèi)存
堆區(qū):保存動態(tài)產(chǎn)生的數(shù)據(jù),如:new出來的對象和數(shù)組,在不使用的時候由Java回收器自動回收Android中內(nèi)存泄漏的例子:
- 單例造成的內(nèi)存泄漏: 在單例中,使用context.getApplicationContext()作為單例的context
匿名內(nèi)部類造成的內(nèi)存泄漏:由于非靜態(tài)內(nèi)部類持有匿名外部類的引用,必須將內(nèi)部類設(shè)置為static- Handler造成的內(nèi)存泄漏:使用static的Handler內(nèi)部類,同時在實現(xiàn)內(nèi)部類中持有Context的弱引用
- 避免使用static變量:由于static變量會跟Activity生命周期一致,當Activity退出后臺被后臺回收時,static變量是不安全,所以也要管理好static變量的生命周期
- 資源未關(guān)閉造成的內(nèi)存泄漏:比如Socket、Broadcast、Cursor、Bitmap、ListView等,使用完后要關(guān)閉
- AsyncTask造成的內(nèi)存泄漏:由于非靜態(tài)內(nèi)部類持有匿名內(nèi)部類的引用而造成內(nèi)存泄漏,可以通過AsyncTask內(nèi)部持有外部Activity的弱引用同時改為靜態(tài)內(nèi)部類或在onDestroy()中執(zhí)行AsyncTask.cancel()進行修復
11.說一下Object的常見方法
clone() toString() equals() hashCode(返回對象的hash碼)notify() wait()
12.ArrayList和HashMapt的底層實現(xiàn),擴容原理
13.hashCode的意義,怎么重寫HashCode
14.RecyclerView的緩存機制
15.Android的手勢檢測,事件分發(fā)
智力題&算法
- 給定一個數(shù)據(jù)流,其中包含無窮盡的搜索關(guān)鍵字(比如,人們在谷歌搜索時不斷輸入的關(guān)鍵字)。如何才能從這個無窮盡的流中隨機的選取1000個關(guān)鍵字?
二叉樹前中后按層遍歷,怎么只遍歷某一層數(shù)據(jù)。