出題人:阿里巴巴出題專家:昀龍/阿里雲彈性人工智能負責人node
參考答案:下面是其中一種寫法,也能夠有不一樣的寫法,好比遞歸等。供參考。python
typedef struct node{
int data;
struct node* next;
node(int d):data(d), next(NULL){}
}node;
void reverse(node* head)
{
if(NULL == head || NULL == head->next){
return;
}
node* prev=NULL;
node* pcur=head->next;
node* next;
while(pcur!=NULL){
if(pcur->next==NULL){
pcur->next=prev;
break;
}
next=pcur->next;
pcur->next=prev;
prev=pcur;
pcur=next;
}
head->next=pcur;
node*tmp=head->next;
while(tmp!=NULL){
cout<<tmp->data<<"\t";
tmp=tmp->next;
}
}
複製代碼
出題人:——阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家c++
參考答案:程序員
1.基礎算法的靈活應用能力(二分法學過數據結構的同窗都知道,但不必定往這個方向考慮;若是學過數值計算的同窗,應該還要能想到牛頓迭代法並解釋清楚)面試
2.退出條件設計算法
已知 sqrt(2)約等於 1.414,那麼就能夠在(1.4, 1.5)區間作二分 查找,如: a) high=>1.5 b) low=>1.4 c) mid => (high+low)/2=1.45 d) 1.45*1.45>2 ? high=>1.45 : low => 1.45 e) 循環到 c)緩存
退出條件 a) 先後兩次的差值的絕對值<=0.0000000001, 則可退出bash
const double EPSINON = 0.0000000001;
double sqrt2( ){
double low = 1.4, high = 1.5;
double mid = (low + high) / 2;
while (high – low > EPSINON){
if (mid*mid < 2){
high = mid;
}
else{
low = mid;
}
mid = (high + low) / 2;
}
return mid;
}
複製代碼
出題人:阿里巴巴出題專家:文景/阿里雲 CDN 資深技術專家數據結構
參考答案:app
2.遞歸使用
5
/ \
3 6
/ \
2 4
/
1
複製代碼
說明:保證輸入的 K 知足 1<=K<=(節點數目)
樹相關的題目,第一眼就想到遞歸求解,左右子樹分別遍歷。聯想到二叉搜索樹的性質,root 大於左子樹,小於右子樹,若是左子樹的節點數目等於 K-1,那麼 root 就是結果,不然若是左子樹節點數目小於 K-1,那麼結果必然在右子樹,不然就在左子樹。所以在搜索的時候同時返回節點數目,跟 K 作對比,就能得出結果了。
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
private class ResultType {
boolean found; // 是否找到
int val; // 節點數目
ResultType(boolean found, int val) {
this.found = found;
this.val = val;
}
}
public int kthSmallest(TreeNode root, int k) {
return kthSmallestHelper(root, k).val;
}
private ResultType kthSmallestHelper(TreeNode root, int k) {
if (root == null) {
return new ResultType(false, 0);
}
ResultType left = kthSmallestHelper(root.left, k);
// 左子樹找到,直接返回
if (left.found) {
return new ResultType(true, left.val);
}
// 左子樹的節點數目 = K-1,結果爲 root 的值
if (k - left.val == 1) {
return new ResultType(true, root.val);
}
// 右子樹尋找
ResultType right = kthSmallestHelper(root.right, k - left.val - 1);
if (right.found) {
return new ResultType(true, right.val);
}
// 沒找到,返回節點總數
return new ResultType(false, left.val + 1 + right.val);
}
}
複製代碼
出題人:文景/阿里雲 CDN 資深技術專家
參考答案:
python版本的:
class LRUCache(object):
def __init__(self, capacity):
""" :type capacity: int """
self.cache = {}
self.keys = []
self.capacity = capacity
def visit_key(self, key):
if key in self.keys:
self.keys.remove(key)
self.keys.append(key)
def elim_key(self):
key = self.keys[0]
self.keys = self.keys[1:]
del self.cache[key]
def get(self, key):
""" :type key: int :rtype: int """
if not key in self.cache:
return -1
self.visit_key(key)
return self.cache[key]
def put(self, key, value):
""" :type key: int :type value: int :rtype: void """
if not key in self.cache:
if len(self.keys) == self.capacity:
self.elim_key()
self.cache[key] = value
self.visit_key(key)
def main():
s =
[["put","put","get","put","get","put","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[
4,4],[1],[3],[4]]]
obj = LRUCache(2)
l=[]
for i,c in enumerate(s[0]):
if(c == "get"):
l.append(obj.get(s[1][i][0]))
else:
obj.put(s[1][i][0], s[1][i][1])
print(l)
if __name__ == "__main__":
main()
複製代碼
c++版本的:
class LRUCache{
public:
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {
auto it = m.find(key);
if (it == m.end()) return -1;
l.splice(l.begin(), l, it->second);
return it->second->second;
}
void set(int key, int value) {
auto it = m.find(key);
if (it != m.end()) l.erase(it->second);
l.push_front(make_pair(key, value));
m[key] = l.begin();
if (m.size() > cap) {
int k = l.rbegin()->first;
l.pop_back();
m.erase(k);
}
}
}
複製代碼
出題人:阿里巴巴出題專家:晨暉 /阿里雲中間件技術部測試開發專家
參考答案:
能夠從代碼開發、測試保障、線上質量三個方面來保障。
在代碼開發階段,有單元測試、代碼Review、靜態代碼掃描等;
測試保障階段,有功能測試、性能測試、高可用測試、穩定性測試、兼容性測試等;
在線上質量方面,有灰度發佈、緊急回滾、故障演練、線上監控和巡檢等。
在互聯網邊緣OB數幾年,發現面試是程序員開啓神奇之門的第一步。
小夥近期會和你們一塊兒探討互聯網巨頭們2019最新的面試題。
請你們多多關注小夥,您的關注與點贊是小夥更新的動力。
加小夥QQ更多福利資源等你領取喲,QQ 758810390