题意整理。

  • 设计一个点赞记录器,包括两个方法like和getLikeUsers。
  • like方法需要传入用户名作为参数,如果没点赞,则记录点赞行为,如果点赞了,则删除点赞记录。
  • getLikeUsers方法,返回所有点赞用户的名字。

方法一(哈希表)

1.解题思路

  • 首先新建一个map,键为String类型,记录用户名,值为Boolean类型,记录用户是否点赞,如果是false,表示未点赞,或取消了点赞;如果是true,表示已点赞。
  • like方法中将对应的标记取反,如果未点赞,则跟新为true,表示记录了点赞行为。如果点赞了,则跟新为false,表示删除了点赞记录。
  • getLikeUsers方法中,返回所有标记为true的用户名。

动图展示: alt

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,所以时间复杂度为O(n)O(n)
  • 空间复杂度:需要额外大小为n的map,以及额外大小为n的list,所以空间复杂度为O(n)O(n)