1. pdd 二面,手撕开放地址法哈希,实现 Get, Set, Delete 操作
Hashing
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <bits/stdc++.h>
using namespace std;

struct Node{
int key;
int value;
Node(): key(-1), value(-1){}
Node(int key, int value) : key(key), value(value) {}
};
struct HashTable{
private:
int size;
vector<Node> table;
const int EMPTY = -1;
const int DELETED = -2;
public:
HashTable(int size): size(size), table(size){
for(int i = 0; i < size; ++i){
table[i].key = EMPTY;
table[i].value = -1;
}
}
int Get(int key){
if (size == 0) return -1;
int h = key % size;
if (h < 0) h += size;
for(int i = 0; i < size; ++i){
int idx = (h + i) % size;
if (table[idx].key == EMPTY) return -1; // not found
if (table[idx].key == key) return table[idx].value;
}
return -1;
}
int Set(int key, int value){
if (size == 0) return -1;
int h = key % size;
if (h < 0) h += size;
int firstDeleted = -1;
for(int i = 0; i < size; ++i){
int idx = (h + i) % size;
if (table[idx].key == key){
table[idx].value = value; // update existing
return 0;
}
if (firstDeleted == -1 && table[idx].key == DELETED){
firstDeleted = idx;
}
if (table[idx].key == EMPTY){
if (firstDeleted != -1) idx = firstDeleted;
table[idx].key = key;
table[idx].value = value;
return 0;
}
}
if (firstDeleted != -1){
table[firstDeleted].key = key;
table[firstDeleted].value = value;
return 0;
}
return -1; // table full
}
int Delete(int key){
if (size == 0) return -1;
int h = key % size;
if (h < 0) h += size;
for(int i = 0; i < size; ++i){
int idx = (h + i) % size;
if (table[idx].key == EMPTY) return -1; // not found
if (table[idx].key == key){
int value = table[idx].value;
table[idx].key = DELETED; // tombstone
table[idx].value = -1;
return value;
}
}
return -1;
}
};
  1. 网易
    找到 n 个数里面第 k 大的,除了排序有没有别的方法
    问了一堆基础知识,static/inline 等等

  2. 华为
    一面双指针,二面贪心

  3. 忘了

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

NoResponse WeChat Pay

WeChat Pay

NoResponse Alipay

Alipay

NoResponse PayPal

PayPal