Redian新闻
>
贡献一个 一个L家的店面题目
avatar
贡献一个 一个L家的店面题目# JobHunting - 待字闺中
g*e
1
设计一个数据结构 add/remove/remove_rand 常数时间复杂度
follow up: 数据可重复
解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
调整数组的大小。
脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
才做出来,估计挂了。发出来赞个人品吧。
更正一下:
上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
用来支持remove_rand
avatar
q*c
2
是不是用类似LRU的结构。

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
j*8
3
是必须要用数组吗?
不然的话double-linked list + hashmap就行了

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
g*e
4
list怎么常数时间remove random?

【在 j*****8 的大作中提到】
: 是必须要用数组吗?
: 不然的话double-linked list + hashmap就行了

avatar
l*a
5
你这个怎么做remove random

【在 j*****8 的大作中提到】
: 是必须要用数组吗?
: 不然的话double-linked list + hashmap就行了

avatar
j*8
6
用一个interger保存当前的size,然后生成一个random position remove就行
不过你说得对,需要另外一个map存 。。

【在 l*****a 的大作中提到】
: 你这个怎么做remove random
avatar
g*e
7
应该不是考察这个。

【在 q********c 的大作中提到】
: 是不是用类似LRU的结构。
avatar
g*e
8
只有hash_map怎么在常数时间内定位一个随机键值?

【在 j*****8 的大作中提到】
: 用一个interger保存当前的size,然后生成一个random position remove就行
: 不过你说得对,需要另外一个map存 。。

avatar
j*8
9
恩,又想了下,俺这个有问题
你说的那个数组的那个是对的!

【在 g*******e 的大作中提到】
: 只有hash_map怎么在常数时间内定位一个随机键值?
avatar
a*u
10
import java.util.*;
public class DesignDataStructure {
Map> map = new HashMap>();
List list = new ArrayList();

public void add(int num){
list.add(num);
int index=list.size()-1;
if(map.containsKey(num)){
map.get(num).add(index);
}else{
Set set =new HashSet();
set.add(index);
map.put(num, set);
}
}
public void delete(int num){
if(map.containsKey(num)==false)
throw new RuntimeException("this number is not in the memory
");
Iterator it = map.get(num).iterator();
int index=it.next();
map.get(num).remove(index);

int last=list.get(list.size()-1);
list.set(index, last);
map.get(last).remove(list.size()-1);
map.get(last).add(index);
}
public void deletRandom(){
Random rand = new Random();
int index=rand.nextInt(list.size());
int num=list.get(index);
delete(num);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
avatar
o*0
11

map存 ,就可以了吧。

【在 j*****8 的大作中提到】
: 用一个interger保存当前的size,然后生成一个random position remove就行
: 不过你说得对,需要另外一个map存 。。

avatar
p*9
12
remove 和 remove_rand啥区别?

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
k*a
13
解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后调整数组的大小。
这个方法虽然对remove_rand可行,但是如果做正常的remove, 那么这个数组如何维护?
看样子需要三个东西?
1. HashMap, (value -> count)
2. Array, (index -> value)
3. HashMap (value -> index)
Add操作: #1HashMap add, Array加入数组尾部,更新#3 hashmap
Remove操作: #1HashMap remove, 从#3 HashMap找到index, 然后remove value, 然
后在Array中根据index找到元素,和Array最后一个元素交换, 并更新数组size
Remove-Rand操作: 从array中随机选取第i个元素,得到value, 根据value,分别在#1
HashMap, #3 HashMap中remove。
重复元素在#1 HashMap中利用count处理,在#3 HashMap中利用list处理 (这里有些不
理想)。
avatar
g*e
14
设计一个数据结构 add/remove/remove_rand 常数时间复杂度
follow up: 数据可重复
解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
调整数组的大小。
脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
才做出来,估计挂了。发出来赞个人品吧。
更正一下:
上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
用来支持remove_rand
avatar
q*c
15
是不是用类似LRU的结构。

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
j*8
16
是必须要用数组吗?
不然的话double-linked list + hashmap就行了

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
g*e
17
list怎么常数时间remove random?

【在 j*****8 的大作中提到】
: 是必须要用数组吗?
: 不然的话double-linked list + hashmap就行了

avatar
l*a
18
你这个怎么做remove random

【在 j*****8 的大作中提到】
: 是必须要用数组吗?
: 不然的话double-linked list + hashmap就行了

avatar
j*8
19
用一个interger保存当前的size,然后生成一个random position remove就行
不过你说得对,需要另外一个map存 。。

【在 l*****a 的大作中提到】
: 你这个怎么做remove random
avatar
g*e
20
应该不是考察这个。

【在 q********c 的大作中提到】
: 是不是用类似LRU的结构。
avatar
g*e
21
只有hash_map怎么在常数时间内定位一个随机键值?

【在 j*****8 的大作中提到】
: 用一个interger保存当前的size,然后生成一个random position remove就行
: 不过你说得对,需要另外一个map存 。。

avatar
j*8
22
恩,又想了下,俺这个有问题
你说的那个数组的那个是对的!

【在 g*******e 的大作中提到】
: 只有hash_map怎么在常数时间内定位一个随机键值?
avatar
a*u
23
import java.util.*;
public class DesignDataStructure {
Map> map = new HashMap>();
List list = new ArrayList();

public void add(int num){
list.add(num);
int index=list.size()-1;
if(map.containsKey(num)){
map.get(num).add(index);
}else{
Set set =new HashSet();
set.add(index);
map.put(num, set);
}
}
public void delete(int num){
if(map.containsKey(num)==false)
throw new RuntimeException("this number is not in the memory
");
Iterator it = map.get(num).iterator();
int index=it.next();
map.get(num).remove(index);
if(map.get(num).isEmpty())
map.remove(num);
int last=list.get(list.size()-1);
list.set(index, last);
map.get(last).remove(list.size()-1);
map.get(last).add(index);
}
public void deletRandom(){
Random rand = new Random();
int index=rand.nextInt(list.size());
int num=list.get(index);
delete(num);
}

public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
avatar
o*0
24

map存 ,就可以了吧。

【在 j*****8 的大作中提到】
: 用一个interger保存当前的size,然后生成一个random position remove就行
: 不过你说得对,需要另外一个map存 。。

avatar
p*9
25
remove 和 remove_rand啥区别?

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

avatar
k*a
26
解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后调整数组的大小。
这个方法虽然对remove_rand可行,但是如果做正常的remove, 那么这个数组如何维护?
看样子需要三个东西?
1. HashMap, (value -> count)
2. Array, (index -> value)
3. HashMap (value -> index)
Add操作: #1HashMap add, Array加入数组尾部,更新#3 hashmap
Remove操作: #1HashMap remove, 从#3 HashMap找到index, 然后remove value, 然
后在Array中根据index找到元素,和Array最后一个元素交换, 并更新数组size
Remove-Rand操作: 从array中随机选取第i个元素,得到value, 根据value,分别在#1
HashMap, #3 HashMap中remove。
重复元素在#1 HashMap中利用count处理,在#3 HashMap中利用list处理 (这里有些不
理想)。
avatar
h*0
27
remove-rand by index ? or remove-rand by value?
example:
input {1, 2, 1},
if remove-rand by index, three nums have the same possibility to be
removed
if remove-rand by value, two distinct nums have the same possibility to
be removed.

小。
护?
#1

【在 k******a 的大作中提到】
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后调整数组的大小。
: 这个方法虽然对remove_rand可行,但是如果做正常的remove, 那么这个数组如何维护?
: 看样子需要三个东西?
: 1. HashMap, (value -> count)
: 2. Array, (index -> value)
: 3. HashMap (value -> index)
: Add操作: #1HashMap add, Array加入数组尾部,更新#3 hashmap
: Remove操作: #1HashMap remove, 从#3 HashMap找到index, 然后remove value, 然
: 后在Array中根据index找到元素,和Array最后一个元素交换, 并更新数组size
: Remove-Rand操作: 从array中随机选取第i个元素,得到value, 根据value,分别在#1

avatar
l*s
28
remove不要真的删,而是放到一个“删除set“,即可。

【在 g*******e 的大作中提到】
: 设计一个数据结构 add/remove/remove_rand 常数时间复杂度
: follow up: 数据可重复
: 解题关键是常数时间删除数组内元素,就是把要删的挪到数组尾部然后
: 调整数组的大小。
: 脑袋不清楚,一直想着数组是有序的,找不到解题思路。在烙印的提示下
: 才做出来,估计挂了。发出来赞个人品吧。
: 更正一下:
: 上面说的不太清楚,除了数组之外,hash_map也是需要的。数组主要
: 用来支持remove_rand

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。