526 · 负载均衡器
描述
为网站实现一个负载均衡器,提供如下的 3 个功能:
添加一台新的服务器到整个集群中 => add(server_id)。
从集群中删除一个服务器 => remove(server_id)。
在集群中随机(等概率)选择一个有效的服务器 => pick()。
最开始时,集群中一台服务器都没有。每次 pick() 调用你需要在集群中随机返回一个 server_id。
样例
样例 1:
输入:
add(1)
add(2)
add(3)
pick()
pick()
pick()
pick()
remove(1)
pick()
pick()
pick()
输出:
1
2
1
3
2
3
3
解释: pick() 的返回值是随机的,也可以是 2 3 3 1 3 2 2 或其他的。
public class LoadBalancer {
int n = 0 ;
Map<Integer , Integer> pos = new HashMap<>() ;
List<Integer> array = new ArrayList<>() ;
Random rand = new Random() ;
public LoadBalancer() {
// do intialization if necessary
}
/*
* @param server_id: add a new server to the cluster
* @return: nothing
*/
public void add(int server_id) {
// write your code here
if(!pos.containsKey(server_id)){
pos.put(server_id , n) ;
array.add(server_id) ;
n++ ;
}
}
/*
* @param server_id: server_id remove a bad server from the cluster
* @return: nothing
*/
public void remove(int server_id) {
// write your code here
if(pos.containsKey(server_id)){
int LastItem = array.get(n-1) ;
int RemoveIdx = pos.get(server_id) ;
pos.put(LastItem , RemoveIdx) ;
array.set(RemoveIdx , LastItem) ;
pos.remove(server_id) ;
array.remove(n-1) ;
n-- ;
}
}
/*
* @return: pick a server in the cluster randomly with equal probability
*/
public int pick() {
// write your code here
return array.get(rand.nextInt(n)) ;
}
}
3250

被折叠的 条评论
为什么被折叠?



