阿里一面(3.23)

好像之前沒有放一面的題,現在補上。話說面試我的那個面試官人好好,一點都沒有爲難我,面之前還和我說了很多家常讓我不那麼緊張(人生第一次接到面試電話,緊張到我舍友說我自我介紹的時候聲音是抖的。。(╥﹏╥)不過聊了50多分鐘吧,很多數據結構和一些基礎問題,我事後又查來鞏固(對,這是有用的,沒想到二面的時候,另一個考官又問人家數組和鏈表啊!!直接就把原理、複雜度和使用範圍講啦~~),不過我結尾時犯了個小錯(後面別人提醒我不能直接問的。。),問了面試官我能過嗎,面試官很和藹的回答我是他面的基礎可以的
((o(゚▽゚)o)))),這其實是篇回憶錄, 不過祝我好運吧~
-----------
1、如何判斷鏈表有環(環和相交http://blog.csdn.net/hackbuteer1/article/details/7583102 )(如果兩個鏈表相交於某一節點,那麼在這個相交節點之後的所有節點都是兩個鏈表所共有的。也就是說,如果兩個鏈表相交,那麼最後一個節點肯定是共有的。先遍歷第一個鏈表,記住最後一個節點,然後遍歷第二個鏈表,到最後一個節點時和第一個鏈表的最後一個節點做比較,如果相同,則相交,否則不相交。時間複雜度爲O( len1 + len2),)

2、幾種排序(https://segmentfault.com/a/1190000002595152
問查聯繫人列表時用哪種排序好,爲什麼(當時講了快速排序)(http://romyli.iteye.com/blog/761655

(android字母排序實現)
(1.6以下(含1.6):name COLLATE LOCALIZED 如:
cursor = getContentResolver().query(People.CONTENT_URI,
null, null, null, People.NAME+” COLLATE LOCALIZED”);
1.6以上:display_name COLLATE LOCALIZED
如:cursor = getContentResolver().query(Uri.parse(“content://com.android.contacts/data/phones”), PEOPLE_PROJECTTION, null, null, ” display_name COLLATE LOCALIZED “);)
(listview提供了方法setSelection(postion))

3、引用和指針的區別
★ 相同點:1. 都是地址的概念;指針指向一塊內存,它的內容是所指內存的地址;引用是某塊內存的別名。
★ 區別:
1. 指針是一個實體,而引用僅是個別名;
3. 引用只能在定義時被初始化一次,之後不可變;指針可變;
引用“從一而終” ^_^
4. 引用沒有 const,指針有 const,const 的指針不可變;
5. 引用不能爲空,指針可以爲空;
6. “sizeof 引用”得到的是所指向的變量(對象)的大小,而“sizeof 指針”得到的是指針本身(所指向的變量或對象的地址)的大小;

4、數組和鏈表的區別
(數組:可以快速隨機訪問,但是插入和刪除需要移動大量的數據;聲明後大小固定,不可改;鏈表:不是順序存儲,通過鏈表連接到了一起)
ArrayList怎麼實現的(http://zhangshixi.iteye.com/blog/674856

5、彙編中如何存儲數據()
寄存器和內存(寄存器:暫存指令、數據和位址,中央處理器內的組成部份,其讀寫速度跟CPU的運行速度基本匹配,分爲通用寄存器和特殊功能寄存器)(直接尋址,寄存器中間接尋址)

6、面對對象思想和java的面對對象(程序中包含各種獨立而又互相調用的對象的思想,傳統的程序設計主張將程序看作一系列函數的集合,或者直接就是一系列對電腦下達的指令。推廣了程序的靈活性和可維護性)

7、多態(面向對象的三個基本特徵是:封裝、繼承、多態)
實現多態,有二種方式,覆蓋,重載。
覆蓋,是指子類重新定義父類的虛函數的做法。
重載,是指允許存在多個同名函數,而這些函數的參數表不同(或許參數個數不同,或許參數類型不同,或許兩者都不同)。
封裝可以隱藏實現細節,使得代碼模塊化;繼承可以擴展已存在的代碼模塊(類);它們的目的都是爲了——代碼重用。而多態則是爲了實現另一個目的——接口重用!)

8、java的內存管理和垃圾處理
(內存泄露的定義: 當某些對象不再被應用程序所使用,但是由於仍然被引用而導致垃圾收集器不能釋放他們.)
怎麼防止內存泄露?
1. 當心集合類,比如 HashMap,ArrayList等,因爲這是最容易發生內存泄露的地方.當集合對象被聲明爲static時,他們的生命週期一般和整個應用程序一樣長。
2. 注意事件監聽和回調.當註冊的監聽器不再使用以後,如果沒有被註銷,那麼很可能會發生內存泄露.
3. 常常是一個對象的成員變量需要被置爲null 時仍然指向其他對象,)
(堆棧,內存管理,垃圾回收 http://www.cnblogs.com/vamei/archive/2013/04/28/3048353.html
JVM中的棧記錄了線程的方法調用。每個線程擁有一個棧。在某個線程的運行過程中,如果有新的方法調用,那麼該線程對應的棧就會增加一個存儲單元,即幀(frame)。在frame中,保存有該方法調用的參數、局部變量和返回地址。Java的參數和局部變量只能是基本類型的變量(比如int),或者對象的引用(reference)。因此,在棧中,只保存有基本類型的變量和對象引用。引用所指向的對象保存在堆中,當我們談論垃圾回收(garbage collection)時,我們主要回收堆(heap)的空間。
Java的普通對象存活在堆中。與棧不同,堆的空間不會隨着方法調用結束而清空
垃圾回收用於釋放不可到達對象所佔據的內存。這是垃圾回收的基本原則。
jvm以棧和static數據爲根(root),從根出發,跟隨所有的引用,就可以找到所有的可到達對象。也就是說,一個可到達對象,一定被根引用,或者被其他可到達對象引用)

9、爲什麼能輸出hello world,經歷了什麼
-》使用Java編寫HelloWorld 的Android應用程序;
-》生成共享庫的頭文件:進入到eclipse生成的Android Project中 :/HelloWorld/bin/classes/com/lucyfyr/ 下,可以看到很多後綴爲.class的文件,就是eclipse爲我們自動編譯好了的java文件,其中HelloWorld.class文件;
-》自動生成對應的函數:Java_com_lucyfyr_HelloWorld_printJNI(Java_ + 包名(com.lucyfyr) + 類名(HelloWorld) + 接口名(printJNI):必須要按此JNI規範來操作;)
-》實現JNI原生函數源文件:新建com_lucyfyr_HelloWorld.c文件;
-》編譯生成so庫,編譯com_lucyfyr_HelloWorld.c成so庫可以和app一起編譯,也可以都單獨編譯。在當前目錄下建立jni文件夾;
-》編譯此模塊:輸入編譯命令
-》輸出。
http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html 說的很清楚,是JNI的使用)

10、string轉成浮點數不用自帶方法
http://www.lxway.com/88588044.htm 首先參數:1)第一個是String,表示需要被轉化的字符串;2)第二個是進制,表示字符串需要當做什麼進制的字符串去解析。
18-30行表示:如果是空字符串,或者進制低於能解析的最小進制(2)或者高於能解析的最大進制(36),則拋出異常;
接下來看40-51行:這裏主要是根據第一個字符去判斷字符串代表的數字是正的還是負的,通過flag negative標記。
剩餘的部分比較複雜,先解釋一下基本思想:取出字符串中的每一位字符,按照進制radix轉化爲數字,倘若不是數字,則返回值爲-1,拋出異常。)
( 1 public static int parseInt(String s){
2 int result = 0;
4 int length = s.length();
6 for(int index = 0; index < length; index ++){
7 int number = s.charAt(index) - ‘0’;
8 result *= 10;
9 result += number;
10 }
12 return result;

----------------------------------
11、進程間的通信(http://blog.csdn.net/love_gaohz/article/details/6636661
管道( pipe ):管道是一種半雙工的通信方式,數據只能單向流動,進程的親緣關係通常是指父子進程關係。

信號量( semophore ) : 信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作爲一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作爲進程間以及同一進程內不同線程之間的同步手段。(讀寫)

消息隊列( message queue ) : 消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩衝區大小受限等缺點。(無網時消息發送,形成隊列)

共享內存( shared memory):這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的IPC方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號量,配合使用,來實現進程間的同步和通信。

套接字( socket ) : 套解口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同及其間的進程通信。

用於進程間通訊(IPC)的四種不同技術:
1. 消息傳遞(管道,FIFO,posix和system v消息隊列)
2. 同步(互斥鎖,條件變量,讀寫鎖,文件和記錄鎖,Posix和System V信號燈)
3. 共享內存區(匿名共享內存區,有名Posix共享內存區,有名System V共享內存區)
4. 過程調用(Solaris門,Sun RPC)

消息隊列和過程調用往往單獨使用,也就是說它們通常提供了自己的同步機制.相反,共享內存區通常需要由應用程序提供的某種同步形式才能正常工作.解決某個特定問題應使用哪種IPC不存在簡單的判定,應該逐漸熟悉各種IPC形式提供的機制,然後根據特定應用的要求比較它們的特性.
12、大頂堆、小頂堆
13、10k的圖片1024*1024,加載內存,存的像素是4m(1024*1024*4個字節=4m)(
一個像素佔32位,8位=1字節(byte),所以一個像素佔4字節的內存)
14、調試工具、斷點原理是什麼(把原程序代碼改了,Dalvik調試監視器服務器
(DDMS的),它提供了端口轉發服務,設備上的屏幕捕獲,線程堆和設備上的信息,logcat,進程,radio狀態信息,來電和短信欺騙,位置數據欺騙,等等)
(Logcat Android日誌系統提供了一個收集和查看系統調試輸出機制。從各種應用程序和系統的部分日誌收集了一系列的循環緩衝區,然後logcat命令可以查看和過濾。你可以使用通過ADB shell使用logcat查看日誌消息。)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章