這周四上午去交大閔行校區(qū)參加美團(tuán)移動(dòng)開發(fā)面試惦积,一面就被虐成狗胁住,看來自己的計(jì)算機(jī)基礎(chǔ)知識(shí)不扎實(shí)五芝,還需要多刷圖書館啊痘儡。分享美團(tuán)移動(dòng)開發(fā)的面試題,自己也總結(jié)下答案枢步。
一.算法:數(shù)字轉(zhuǎn)字符串
string my_itoa(int num)
{
if (num == 0) {
return "0";
}
string result = "";
bool positive = true;
if(num < 0)
{
positive = false;
num = -num;
}
vector<int> str;
while (num > 0) {
str.push_back(num % 10);
num = num / 10;
}
for (int i = str.size() - 1; i >= 0; i--) {
result += str[i] + '0';
}
return positive ? result : "-" + result;
}
這道題需要注意:
- 數(shù)字小于等于0的情況處理
- 單個(gè)數(shù)字轉(zhuǎn)換成char的方法
二.算法:快排的原理沉删,時(shí)間和空間復(fù)雜度,用快排的思想求第k大的數(shù)价捧。這個(gè)就不寫了丑念,基礎(chǔ)的排序算法。
三.算法:求文件中第k大的數(shù)结蟋,文件比內(nèi)存大脯倚,不能全部放入內(nèi)存中。
關(guān)于這個(gè)題目嵌屎,推薦一篇文章:十道海量數(shù)據(jù)處理面試題與十個(gè)方法大總結(jié)
四.數(shù)據(jù)庫:事務(wù)的定義推正,事務(wù)的ACID特性,事務(wù)的實(shí)現(xiàn)原理
事務(wù)的定義:事務(wù)是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個(gè)邏輯單位宝惰,由一個(gè)有限的數(shù)據(jù)庫操作序列構(gòu)成植榕。
事務(wù)的ACID特性:
- 原子性(Atomicity):事務(wù)作為一個(gè)整體被執(zhí)行,包含在其中的對(duì)數(shù)據(jù)庫的操作要么全部被執(zhí)行尼夺,要么都不執(zhí)行
- 一致性(Consistency):事務(wù)應(yīng)確保數(shù)據(jù)庫的狀態(tài)從一個(gè)一致狀態(tài)轉(zhuǎn)變?yōu)榱硪粋€(gè)一致狀態(tài)尊残。一致狀態(tài)的含義是數(shù)據(jù)庫中的數(shù)據(jù)應(yīng)滿足完整性約束。
- 隔離性(Isolation):多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)淤堵,一個(gè)事務(wù)的執(zhí)行不應(yīng)影響其它事務(wù)的執(zhí)行寝衫。
- 持久性(Durability):已被提交的事務(wù)對(duì)數(shù)據(jù)庫的修改應(yīng)該永久保存在數(shù)據(jù)庫中。
事務(wù)的定義和ACID特性參考維基百科:數(shù)據(jù)庫事務(wù)
- 事務(wù)的實(shí)現(xiàn)原理
事務(wù)的(ACID)特性是由關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS拐邪,數(shù)據(jù)庫系統(tǒng))來實(shí)現(xiàn)的慰毅。數(shù)據(jù)庫管理系統(tǒng)采用日志來保證事務(wù)的原子性、一致性和持久性扎阶。日志記錄了事務(wù)對(duì)數(shù)據(jù)庫所做的更新汹胃,如果某個(gè)事務(wù)在執(zhí)行過程中發(fā)生錯(cuò)誤婶芭,就可以根據(jù)日志,撤銷事務(wù)對(duì)數(shù)據(jù)庫已做的更新着饥,使數(shù)據(jù)庫退回到執(zhí)行事務(wù)前的初始狀態(tài)犀农。
數(shù)據(jù)庫管理系統(tǒng)采用鎖機(jī)制來實(shí)現(xiàn)事務(wù)的隔離性。當(dāng)多個(gè)事務(wù)同時(shí)更新數(shù)據(jù)庫中相同的數(shù)據(jù)時(shí)宰掉,只允許持有鎖的事務(wù)能更新該數(shù)據(jù)井赌,其他事務(wù)必須等待,直到前一個(gè)事務(wù)釋放了鎖贵扰,其他事務(wù)才有機(jī)會(huì)更新該數(shù)據(jù)。
事務(wù)的實(shí)現(xiàn)原理參考:談?wù)剶?shù)據(jù)庫的ACID
五.數(shù)據(jù)庫:索引的定義流部,索引的實(shí)現(xiàn)原理
索引的定義:索引時(shí)數(shù)據(jù)庫表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)戚绕,使用索引可快速訪問數(shù)據(jù)庫表中的特定信息。
索引的實(shí)現(xiàn)原理:B-Tree或者B+Tree枝冀,具體詳細(xì)解析:數(shù)據(jù)庫進(jìn)階系列之一:漫談數(shù)據(jù)庫索引
六.網(wǎng)絡(luò):HTTP包有哪幾部分構(gòu)成舞丛,HTTP包頭部的關(guān)鍵字
HTTP請(qǐng)求包(GET、POST等請(qǐng)求方法)由三個(gè)部分構(gòu)成果漾,分別是:方法-URI-協(xié)議/版本球切,請(qǐng)求頭,請(qǐng)求正文绒障。下面是一個(gè)HTTP請(qǐng)求包(GET)的例子:
GET /index.jsp HTTP/1.1
Accept-Language:zh-cn
Connection:Keep-Alive
Host:192.168.0.106
Content-Length:37
userName=test&password=test
GET就是請(qǐng)求方法吨凑,HTTP 1.1支持七種請(qǐng)求方法:GET、POST户辱、HEAD鸵钝、OPTIONS、PUT庐镐、DELETE和TRACE等恩商,常用的請(qǐng)求方法為GET和POST
和HTTP請(qǐng)求包相似,由三個(gè)部分構(gòu)成必逆,分別是:協(xié)議-狀態(tài)代碼-描述怠堪,應(yīng)答頭,應(yīng)答正文名眉。下面是一個(gè)HTTP應(yīng)答的例子:
HTTP/1.1 200 OK
Server:Microsoft-IIS/4.0
Date:Sun, 17 Oct 2015 14:50:00 GMT
Content-Type:text/html
Last-Modified:Thu, 15 Oct 2015 09:00:00 GMT
Content-Length:90
<html>
<head>
<title>已被虐慘</title>
</head>
<body>
<h1>再接再厲</h1>
</body>
</html>
HTTP頭部常用的關(guān)鍵字:
- Cache-Control:指定請(qǐng)求和響應(yīng)遵循的緩存機(jī)制
- Date:表示消息發(fā)送的時(shí)間
- Pragma:用來包含實(shí)現(xiàn)特定的指令粟矿,最常用的是Pragma:no-cache
- Host:指定請(qǐng)求資源的Internet主機(jī)和端口號(hào)
- User-Agent:包含發(fā)出請(qǐng)求的用戶信息
- Server:包含處理請(qǐng)求的原始服務(wù)器的軟件信息
- Content-Type:用于向接收方指示實(shí)體的介質(zhì)類型
- Last-modified:指定服務(wù)器上保存內(nèi)容的最后修訂時(shí)間
- Set-Cookie:設(shè)置和頁面關(guān)聯(lián)的Cookie
- Refresh:表示瀏覽器應(yīng)該在多少時(shí)間之內(nèi)刷新文檔
完整的HTTP頭部字段列表:List of HTTP header fields
七.TCP/IP協(xié)議分層,網(wǎng)絡(luò)層能不能保證可靠性璧针,為什么嚷炉,傳輸層能不能保證可靠性,為什么探橱,TCP的三次握手和四次揮手申屹。
TCP/IP協(xié)議分為五層:應(yīng)用層绘证、傳輸層、網(wǎng)絡(luò)層哗讥、數(shù)據(jù)鏈路層和物理層嚷那,具體就不展開了
網(wǎng)絡(luò)層智能提供盡最大努力服務(wù),并不能保證可靠性杆煞。
傳輸層中有兩個(gè)協(xié)議魏宽,TCP和UDP。
TCP---傳輸控制協(xié)議决乎,提供的是面向連接队询、可靠的字節(jié)流服務(wù)。當(dāng)客戶和服務(wù)器彼此交換數(shù)據(jù)時(shí)构诚,必須先在雙方之間建立一個(gè)TCP連接蚌斩,之后才能傳輸數(shù)據(jù)。TCP提供超時(shí)重發(fā)范嘱、丟棄重復(fù)數(shù)據(jù)送膳、流量控制等功能,保證數(shù)據(jù)能從一端傳到另一端丑蛤。
UDP---用戶數(shù)據(jù)協(xié)議叠聋,是一個(gè)簡單的面向數(shù)據(jù)的運(yùn)輸層協(xié)議。UDP不提供可靠性受裹,它只是把應(yīng)用程序傳給IP層的數(shù)據(jù)報(bào)發(fā)送出去碌补,但是并不能保證它們能到達(dá)目的地。由于UDP在傳輸數(shù)據(jù)報(bào)不用在客戶和服務(wù)器之間建立一個(gè)連接名斟,且沒有重發(fā)機(jī)制脑慧,故而傳輸速度很快。
TCP的三次揮手和四次揮手見下圖:
![TCP](http://hi.csdn.net/attachment/201108/7/0_131271823564Rx.gif)
圖是盜的砰盐,侵必刪闷袒,原文地址:TCP協(xié)議中的三次握手和四次揮手(圖解)
八.HTTPS是什么,HTTPS過程中岩梳,證書具體是怎么起作用的
這個(gè)時(shí)候就需要搬出大神的博客了:SSL/TLS協(xié)議運(yùn)行機(jī)制的概述
比我寫的好了100倍不止囊骤,膜拜!
九.操作系統(tǒng):死鎖的產(chǎn)生冀值、預(yù)防和避免
只能繼續(xù)貼了:死鎖的產(chǎn)生也物、預(yù)防和避免
十.iOS:為什么category無法使用property,如果需要類似于property的行為列疗,怎么辦
實(shí)際上來說滑蚯,category中是可以使用property的,只是類不會(huì)自動(dòng)生成對(duì)應(yīng)的實(shí)例變量,也不會(huì)自動(dòng)實(shí)現(xiàn)getter和setter告材,這樣的property就是名存實(shí)亡了坤次。至于原因,google到了美團(tuán)技術(shù)團(tuán)隊(duì)博客(好尷尬斥赋。缰猴。。)疤剑,里面是這么講的:
extension看起來很像一個(gè)匿名的category滑绒,但是extension和有名字的category幾乎完全是兩個(gè)東西。 extension在編譯期決議隘膘,它就是類的一部分疑故,在編譯期和頭文件里的@interface以及實(shí)現(xiàn)文件里的@implement一起形成一個(gè)完整的類,它伴隨類的產(chǎn)生而產(chǎn)生弯菊,亦隨之一起消亡焰扳。extension一般用來隱藏類的私有信息,你必須有一個(gè)類的源碼才能為一個(gè)類添加extension误续,所以你無法為系統(tǒng)的類比如NSString添加extension。
但是category則完全不一樣扫茅,它是在運(yùn)行期決議的蹋嵌。
就category和extension的區(qū)別來看,我們可以推導(dǎo)出一個(gè)明顯的事實(shí)葫隙,extension可以添加實(shí)例變量栽烂,而category是無法添加實(shí)例變量的(因?yàn)樵谶\(yùn)行期,對(duì)象的內(nèi)存布局已經(jīng)確定恋脚,如果添加實(shí)例變量就會(huì)破壞類的內(nèi)部布局腺办,這對(duì)編譯型語言來說是災(zāi)難性的)。
而關(guān)于實(shí)現(xiàn)property類似的行為糟描,博客中講到可以求助關(guān)聯(lián)對(duì)象來實(shí)現(xiàn)怀喉。
MyClass+Category1.h:
#import "MyClass.h"
@interface MyClass (Category1)
@property(nonatomic,copy) NSString *name;
@end
MyClass+Category1.m:
#import "MyClass+Category1.h"
#import <objc/runtime.h>
@implementation MyClass (Category1)
+ (void)load
{
NSLog(@"%@",@"load in Category1");
}
- (void)setName:(NSString *)name
{
objc_setAssociatedObject(self,
"name",
name,
OBJC_ASSOCIATION_COPY);
}
- (NSString*)name
{
NSString *nameObject = objc_getAssociatedObject(self, "name");
return nameObject;
}
@end
對(duì)這個(gè)博客感興趣的,鏈接在此:http://tech.meituan.com/DiveIntoCategory.html
十一.iOS:為什么UI必須在主線程修改
這個(gè)問題嚴(yán)格意義上來說并不是一個(gè)iOS的問題船响,考官對(duì)我也有提示躬拢,奈何自己還是沒答出來。
其實(shí)這就是一個(gè)操作系統(tǒng)題见间。答案應(yīng)該是UI操作并不是線程安全的聊闯,多線程更新UI會(huì)造成死鎖,競爭條件等多種問題米诉。因?yàn)?a target="_blank" rel="nofollow">Java的AWT庫的痛苦教訓(xùn)菱蔬,一般設(shè)計(jì)都不會(huì)允許多線程操作UI。iOS推薦UI操作在主線程中進(jìn)行,避免出現(xiàn)crash等無法預(yù)知的問題拴泌。
十二.iOS:UI編寫怎么多人協(xié)作魏身,有哪些方法,優(yōu)缺點(diǎn)
我只能想到兩種:
- 建立多個(gè)Xib弛针,最后合到一個(gè)StoryBoard中去
- 代碼構(gòu)建
不知道考官還有什么高招叠骑,請(qǐng)教他,他也不回答我削茁,惆悵宙枷。。茧跋。
十三.iOS:ARC是什么慰丛,strong、weak和assign關(guān)鍵詞瘾杭,weak和assign的區(qū)別
這里就不詳細(xì)寫了诅病,挺簡單的,稍微重要一點(diǎn)的就是weak和assign的區(qū)別粥烁。weak修飾的屬性贤笆,當(dāng)指向的對(duì)象被釋放(引用計(jì)數(shù)為0)的時(shí)候,會(huì)被自動(dòng)置為nil讨阻,而assign沒有這個(gè)功能芥永。
十四.iOS:為什么iOS開發(fā)中,控件一般為weak而不是strong
好吧钝吮,當(dāng)時(shí)也沒回答好埋涧,這里搜到一個(gè)知乎問題:為什么iOS開發(fā)中,控件一般為weak而不是strong奇瘦?
大概總結(jié)就是:
IBOutlet的屬性一般可以設(shè)為weak是因?yàn)樗呀?jīng)被view引用了棘催,除非view被釋放,否則IBOutlet的屬性也不會(huì)被釋放耳标,另外IBOutlet屬性的生命周期和view應(yīng)該是一致的醇坝,所以IBOutlet屬性一般設(shè)為weak。
簡單的說次坡,如果IBOutlet對(duì)象是nib/sb scene的擁有者(File’s owner)所持有的對(duì)象纲仍,那么很顯然擁有者必須“擁有”對(duì)象的指針,因此屬性應(yīng)設(shè)置為strong贸毕。而其他的IBOutlet對(duì)象的屬性需要設(shè)置為weak郑叠,因?yàn)閾碛姓卟⒉恍枰皳碛小彼麄兊闹羔槨?/p>
但是材鹦,我搜到了一個(gè)stackoverflow的問題:Should IBOutlets be strong or weak under ARC?
stackoverflow有一些爭論晕粪,大家能理解中間的思想就好。
十五.iOS:關(guān)于runtime你知道哪些亚情,運(yùn)行時(shí)調(diào)用selector有哪些方法
runtime真是太大一個(gè)部分了,直接求助大神了:Objective-C Runtime
十六.iOS:iOS9新特性沸版,Swift2新特性
關(guān)于這樣的問題嘁傀,我一般都只能浮于表面,完全沒有自己去玩過新特性视粮,需要多看多試跋赴臁!
十七.iOS:MVVM設(shè)計(jì)模式
- Model - model 在 MVVM 中沒有真正的變化. 取決于你的偏好, 你的 model 可能會(huì)或可能不會(huì)封裝一些額外的業(yè)務(wù)邏輯工作.
- View - view 包含實(shí)際 UI 本身(不論是 UIView 代碼, storyboard 和 xib), 任何視圖特定的邏輯, 和對(duì)用戶輸入的反饋. 在 iOS 中這不僅需要 UIView 代碼和那些文件, 還包括很多需由 UIViewController 處理的工作.
- View-Model - 它的職責(zé)之一就是作為一個(gè)表現(xiàn)視圖顯示自身所需數(shù)據(jù)的靜態(tài)模型;但它也有收集, 解釋和轉(zhuǎn)換那些數(shù)據(jù)的責(zé)任. 這留給了 view (controller) 一個(gè)更加清晰明確的任務(wù): 呈現(xiàn)由 view-model 提供的數(shù)據(jù).
我的理解就是把MVC中一些本來由Controller做的事情分出來給View做了蕾殴,解決了Controller臃腫的問題笑撞,不知道這種理解對(duì)不對(duì)。
十八.設(shè)計(jì)API完成客戶端和服務(wù)器訂單的增量更新
直接給這個(gè)問題給跪了钓觉,自己以前也沒做過相應(yīng)的東西茴肥,回答的時(shí)候基本無法組織語言。
找到一篇文章荡灾,說得還不錯(cuò):app后端設(shè)計(jì)(10)--數(shù)據(jù)增量更新
貼下文章中增量更新的原理吧:
增量更新的原理是在數(shù)據(jù)庫中瓤狐,每條數(shù)據(jù)都必須有update_time這個(gè)值,記錄數(shù)據(jù)最后更新的時(shí)間批幌,當(dāng)app從服務(wù)器獲取了一次數(shù)據(jù)后(返回的數(shù)據(jù)必須按時(shí)間排序础锐,update_time最近的在第一條),記錄下第一條數(shù)據(jù)的update_time荧缘,當(dāng)再次獲取數(shù)據(jù)就只需要獲取上個(gè)時(shí)間點(diǎn)到訪問服務(wù)器這刻為止所更新的數(shù)據(jù)即可