题意整理。
- 设计一个点赞记录器,包括两个方法like和getLikeUsers。
- like方法需要传入用户名作为参数,如果没点赞,则记录点赞行为,如果点赞了,则删除点赞记录。
- getLikeUsers方法,返回所有点赞用户的名字。
方法一(哈希表)
1.解题思路
- 首先新建一个map,键为String类型,记录用户名,值为Boolean类型,记录用户是否点赞,如果是false,表示未点赞,或取消了点赞;如果是true,表示已点赞。
- like方法中将对应的标记取反,如果未点赞,则跟新为true,表示记录了点赞行为。如果点赞了,则跟新为false,表示删除了点赞记录。
- getLikeUsers方法中,返回所有标记为true的用户名。
动图展示:
2.代码实现
import java.util.*;
public class Main {
public static void main(String[] args) {
LikeRecorder recorder = new LikeRecorderImpl();
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String name = scanner.next();
recorder.like(name);
}
System.out.println(Arrays.toString(recorder.getLikeUsers()));
}
}
/**
* 点赞记录器
*/
interface LikeRecorder {
/**
* 若用户没有点赞过,则记录此次点赞行为。
* 若用户曾经点赞过,则删除用户点赞记录。
*
* @param username 用户名
*/
void like(String username);
/**
* 返回所有点赞的用户名
*
* @return 用户名数组
*/
String[] getLikeUsers();
}
class LikeRecorderImpl implements LikeRecorder {
//用map记录用户是否点赞,如果是false,表示未点赞,或取消了点赞;如果是true,表示已点赞
Map<String,Boolean> map=new HashMap<>();
@Override
public void like(String username){
//如果用户未点赞,则跟新为已点赞,如果用户已经点赞,则重置为未点赞
map.put(username,!map.getOrDefault(username,false));
}
@Override
public String[] getLikeUsers(){
List<String> list=new ArrayList<>();
//遍历map,将已点赞的用户添加到list
for(String key:map.keySet()){
boolean value=map.get(key);
//value为true表示已点赞
if(value){
list.add(key);
}
}
//将list转化为String类型数组
return list.toArray(new String[list.size()]);
}
}
3.复杂度分析
- 时间复杂度:假设输入的用户名的数量为n,需要将所有的用户名加入到map,所以时间复杂度为。
- 空间复杂度:需要额外大小为n的map,以及额外大小为n的list,所以空间复杂度为。