MongoDB Phonescreen
Anonymous User
4348

List of Users with UserId and Name
List of Logins with UserId and timestamp
Return leaderboard - Name and unique(login),

Example:
Users - [{1,"qw"},{2,"er"}]
Logins - [{1,1},{1,1},{1,3},{2,4},{2,5},{1,7}]
output (Print in descending order based on login attempts)
"qw" : 3
"er" : 2

User "qw" logged 4 times in total, unique attempts - 3. you can assume any input type (either 2d array or List).

Solution :

static class User {
int id;
String name;

	User(int id, String name) {
		this.id = id;
		this.name = name;
	}
}

static class Login {
	int id;
	int timestamp;

	Login(int id, int timestamp) {
		this.id = id;
		this.timestamp = timestamp;
	}
}

static class LeaderBoard implements Comparable<LeaderBoard> {
	String name;
	int uniqueLogin;

	LeaderBoard(String name, int uniqueLogin) {
		this.name = name;
		this.uniqueLogin = uniqueLogin;
	}

	@Override
	public int compareTo(LeaderBoard o2) {
		return o2.uniqueLogin - this.uniqueLogin;
	}
}

public static void main(String[] args) {
	List<User> users = new ArrayList<>();
	users.add(new User(1, "qw"));
	users.add(new User(2, "er"));
	List<Login> logins = new ArrayList<>();
	logins.add(new Login(1, 1));
	logins.add(new Login(1, 1));
	// logins.add(new Login(1, 3));
	logins.add(new Login(2, 4));
	logins.add(new Login(2, 5));
	// logins.add(new Login(1, 7));

	List<LeaderBoard> lists = getLeaderBoard(users, logins);
	lists.stream().forEach(x -> System.out.println(x.name + ":" + x.uniqueLogin));
}

private static List<LeaderBoard> getLeaderBoard(List<User> users, List<Login> logins) {
	List<LeaderBoard> leaderBoardList = new ArrayList<>();
	Map<Integer, Set<Integer>> uniqueLoginMap = new HashMap<>();
	for (Login login : logins) {
		Set<Integer> uniqueTs = uniqueLoginMap.getOrDefault(login.id, new HashSet<>());
		uniqueTs.add(login.timestamp);
		uniqueLoginMap.put(login.id, uniqueTs);
	}

	Map<Integer, String> userMap = new HashMap<>();
	for (User user : users) {
		userMap.put(user.id, user.name);
	}

	for (int id : uniqueLoginMap.keySet()) {
		LeaderBoard leader = new LeaderBoard(userMap.get(id), uniqueLoginMap.get(id).size());
		leaderBoardList.add(leader);
	}
	Collections.sort(leaderBoardList);
	return leaderBoardList;
}
Comments (6)