Interview Question
SDE-3sCountry: United States
class LoginFailureInfo {
long initialFailureTime
int attempt = 0
}
class LoginHelper {
def failureTable = [:] // Hash Map of User to LoginFailureInfo
def login(String user, String password) {
if (loginFailed) {
def hacked = isAccountHacked(user) // isAccountHacked is called when login fails
// Do something appropriate if hacked
} else {
// Successful login. Remove failure info from hash map
if (failureTable[user]) {
failureTable.remove(user)
}
}
}
def isAccountHacked(String user) {
// Check for previous attempts and reset counter
// if the current failure is occuring after 36000 millis
def currentTime = new Date().getTime()
if (failureTable[user]) { // If a previous failed attempt exists
if (currentTime - failureTable[user].initialFailureTime > 36000) {
failureTable[user].initialFailureTime = currentTime // reset the time
failureTable[user].attempt = 1 // reset the counter to 1
} else {
failureTable[user].attempt++
}
} else {
// If this is the first failure, add a new entry to map
failureTable << [user: new LoginFailureInfo(initialFailureTime: currentTime, attempt: 1)]
}
// Check the number of failures from hash map
if (failureTable[user].attempts >= 5) {
true
} else {
false
}
}
}
class LoginFailureInfo {
long initialFailureTime
int attempt = 0
}
class LoginHelper {
def failureTable = [:] // Hash Map of User to LoginFailureInfo
def login(String user, String password) {
if (loginFailed) {
def hacked = isAccountHacked(user) // isAccountHacked is called when login fails
// Do something appropriate if hacked
} else {
// Successful login. Remove failure info from hash map
if (failureTable[user]) {
failureTable.remove(user)
}
}
}
def isAccountHacked(String user) {
// Check for previous attempts and reset counter
// if the current failure is occuring after 36000 millis
def currentTime = new Date().getTime()
if (failureTable[user]) { // If a previous failed attempt exists
if (currentTime - failureTable[user].initialFailureTime > 36000) {
failureTable[user].initialFailureTime = currentTime // reset the time
failureTable[user].attempt = 1 // reset the counter to 1
} else {
failureTable[user].attempt++
}
} else {
// If this is the first failure, add a new entry to map
failureTable << [user: new LoginFailureInfo(initialFailureTime: currentTime, attempt: 1)]
}
// Check the number of failures from hash map
if (failureTable[user].attempts >= 5) {
true
} else {
false
}
}
}
public class AccountHackHelper
{
int n;
SortedList<DateTime, DateTime> store;
public AccountHackHelper(int n)
{
this.n = n;
store = new SortedList<DateTime, DateTime>(n);
}
public bool IsAccountHacked(string userName, DateTime currentDate)
{
StoreFailedLogin(currentDate);
if (store.Count == n && (currentDate - store.First().Value).TotalSeconds < 3600 )
{
return true;
}
return false;
}
private void StoreFailedLogin(DateTime currentDate)
{
if (store.Count == n) { store.RemoveAt(0); }
store.Add(currentDate, currentDate);
}
}
- NoOne October 07, 2016