题目的主要信息:

  • 为了实现点赞功能,设计一个点赞记录器,该工具包含如下两个方法:
    1. like方法:该方法需要传入用户名作为参数,如果用户没点赞过,则记录本次点赞行为,若用户已经点赞过,则删除他的点赞行为。
    2. getLikeUsers方法:该方法需要返回所有点赞用户的名字,不要求顺序。

具体做法:

要能识别用户名且唯一点赞,我们采用HashSet记录所有点赞的用户名,Like方法中我们查找HashSet中是否包含这个名字,如果有则删除,如果没有则加入,以此来实现点赞和取消。getLikeUsers方法中,我们将HashSet转变成字符串数组后返回,然后输出。 alt

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转化成字符串数组输出
    }
}

复杂度分析:

  • 时间复杂度:O(n)O(n),其中nn输入的名字数量,HashSet基于散列,每次操作复杂度都是O(1)O(1)
  • 空间复杂度:O(n)O(n),最坏情况所有点赞人名字都不同,HashSet不断增大,需要nn长度的空间