1.最近的請(qǐng)求次數(shù),屬于窗口類題型,都是使用隊(duì)列把前面不符合的去掉裳涛,再進(jìn)行計(jì)算剩下的
int ping(int t) 在時(shí)間 t 添加一個(gè)新請(qǐng)求,其中 t 表示以毫秒為單位的某個(gè)時(shí)間,并返回過(guò)去 3000 毫秒內(nèi)發(fā)生的所有請(qǐng)求數(shù)(包括新請(qǐng)求)落午。確切地說(shuō)析显,返回在 [t-3000, t] 內(nèi)發(fā)生的請(qǐng)求數(shù)鲫咽。
解法:通過(guò)保持?jǐn)?shù)據(jù)都是3000毫秒內(nèi)的數(shù)據(jù)進(jìn)行計(jì)數(shù),換句話說(shuō)就是每次 新t進(jìn)來(lái),就把3000毫秒外的刪除分尸。
用隊(duì)列解決:
class RecentCounter {
var queue = [Int]()
init() {
}
func ping(_ t: Int) -> Int {
if queue.count == 0 {
return 1
}
while queue.first! > t - 3000 {
queue.removeFirst()
}
return queue.count
}
}
用數(shù)組的官方方法解決:時(shí)間為100%锦聊,內(nèi)存77%
var array = [Int]()
init() {
}
func ping(_ t: Int) -> Int {
array.removeAll {$0 < t - 3000 }
array.append(t)
return array.count
}
2.[無(wú)法吃午餐的學(xué)生數(shù)量]
學(xué)校的自助午餐提供圓形和方形的三明治,分別用數(shù)字 0 和 1 表示箩绍。所有學(xué)生站在一個(gè)隊(duì)列里孔庭,每個(gè)學(xué)生要么喜歡圓形的要么喜歡方形的。
餐廳里三明治的數(shù)量與學(xué)生的數(shù)量相同材蛛。所有三明治都放在一個(gè) 棧 里圆到,每一輪:
如果隊(duì)列最前面的學(xué)生 喜歡 棧頂?shù)娜髦危敲磿?huì) 拿走它 并離開(kāi)隊(duì)列卑吭。
否則芽淡,這名學(xué)生會(huì) 放棄這個(gè)三明治 并回到隊(duì)列的尾部。
這個(gè)過(guò)程會(huì)一直持續(xù)到隊(duì)列里所有學(xué)生都不喜歡棧頂?shù)娜髦螢橹埂?/p>
給你兩個(gè)整數(shù)數(shù)組 students 和 sandwiches 豆赏,其中 sandwiches[i] 是棧里面第 i 個(gè)三明治的類型(i = 0 是棧的頂部)挣菲, students[j] 是初始隊(duì)列里第 j 名學(xué)生對(duì)三明治的喜好(j = 0 是隊(duì)列的最開(kāi)始位置)。請(qǐng)你返回?zé)o法吃午餐的學(xué)生數(shù)量掷邦。
解法:把喜歡吃午餐的學(xué)生分類白胀,得到每類學(xué)生的個(gè)數(shù),數(shù)組/字典表示耙饰,然后根據(jù)遍歷三文治纹笼,根據(jù)元素把響應(yīng)學(xué)生減少,直到一類學(xué)生個(gè)數(shù)為0苟跪,說(shuō)明此輪此類三文治還有廷痘,但學(xué)生上輪已經(jīng)輪完,沒(méi)有了件已,那說(shuō)明此類三文治已經(jīng)無(wú)法被選完笋额,所以說(shuō)明游戲已經(jīng)到了結(jié)束的時(shí)候,那這時(shí)可以返回各類學(xué)生的個(gè)數(shù)篷扩,也就是無(wú)法吃午餐的學(xué)生數(shù)兄猩。
數(shù)組解法:時(shí)間空間雙100%。
func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
// 分兩類學(xué)生鉴未,喜歡圓形/方形
var stuLike = [Int](repeating: 0, count: 2)
for x in students {
// 把所有學(xué)生遍歷分類
stuLike[x] += 1
}
// 把三文治遍歷枢冤,通過(guò)對(duì)應(yīng)0,1 獲取對(duì)應(yīng)學(xué)生進(jìn)行匹配減少
for y in sandwiches {
// 當(dāng)其中一類學(xué)生為0铜秆,說(shuō)明三文治還有淹真,但喜歡此類別的學(xué)生已經(jīng)沒(méi)有了,說(shuō)明三文治肯定無(wú)法被調(diào)完连茧,退出遍歷
if stuLike[y] == 0 {
break
}
stuLike[y] -= 1
}
// 此時(shí)返回的就是最終無(wú)法挑中喜歡三文治的兩類學(xué)生總數(shù)
return stuLike[0] + stuLike[1]
}
字典解法核蘸,時(shí)間為33%巍糯,空間33%,不是最佳解法客扎。
func countStudents(_ students: [Int], _ sandwiches: [Int]) -> Int {
if students.count == 0 {
return 0
}
var map = [Int: Int]()
// 需要初始化兩類為0
map[0] = 0
map[1] = 0
for student in students {
map[student]! += 1
}
for san in sandwiches {
if map[san] == 0 {
break
}
map[san]! -= 1
}
return (map[0] ?? 0) + (map[1] ?? 0)
}