题目的主要信息:
- 为了实现点赞功能,设计一个点赞记录器,该工具包含如下两个方法:
- like方法:该方法需要传入用户名作为参数,如果用户没点赞过,则记录本次点赞行为,若用户已经点赞过,则删除他的点赞行为。
- getLikeUsers方法:该方法需要返回所有点赞用户的名字,不要求顺序。
具体做法:
要能识别用户名且唯一点赞,我们采用HashSet记录所有点赞的用户名,Like方法中我们查找HashSet中是否包含这个名字,如果有则删除,如果没有则加入,以此来实现点赞和取消。getLikeUsers方法中,我们将HashSet转变成字符串数组后返回,然后输出。
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 {
private HashSet<String> names = new HashSet(); //用HashSet记录点赞用户名
public void like(String name){
if(names.contains(name)) //如果这个人已经被记录说明已经点过赞了
names.remove(name); //取消他的点赞
else
names.add(name); //加入他的点赞
}
public String[] getLikeUsers(){
return names.toArray(new String[names.size()]); //将HashSet转化成字符串数组输出
}
}
复杂度分析:
- 时间复杂度:,其中输入的名字数量,HashSet基于散列,每次操作复杂度都是
- 空间复杂度:,最坏情况所有点赞人名字都不同,HashSet不断增大,需要长度的空间