# Fraudulent Activity Notifications – HackerRank Solution

In this post, we will solve Fraudulent Activity Notifications HackerRank Solution. This problem (Fraudulent Activity Notifications) is a part of HackerRank Problem Solving series.

## Solution – Fraudulent Activity Notifications – HackerRank Solution

### C++

#include <iostream>
#include <cstdio>

using namespace std;

int arr[200010];
int temp_arr[200010];
int counts[210];

float get_median(int size) {
int index = 0;
for (int i = 0; i < 210 ; i++) {
int count = counts[i];
while (count--) {
temp_arr[index++] = i;
if (index > size/2) { break; }
}
if (index > size/2) { break; }
}
return size % 2 == 1 ? temp_arr[size/2] : (temp_arr[size/2] + temp_arr[size/2-1])/2.0;
}

int main() {
int n, d;

scanf("%d %d", &n, &d);
for (int i = 0; i < n ; i++) {
scanf("%d", &arr[i]);
}

int alarm_count = 0;
float median = 210;

for (int i = 0; i < d ; i++) {
counts[arr[i]]++;
}
median = get_median(d);

for (int i = d; i < n; i++) {
if (arr[i] >= 2*median) {
alarm_count++;
}

// update counts array
counts[arr[i-d]]--;
counts[arr[i]]++;

median = get_median(d);
}

printf("%d\n", alarm_count);
return 0;
}

### Python

#!/bin/python3

import sys
import bisect as bs

def index(a, x):
'Locate the leftmost value exactly equal to x'
i = bs.bisect_left(a, x)
if i != len(a) and a[i] == x:
return i
raise ValueError

def median(a_sorted, days):
half = len(a_sorted)//2

if days % 2:
median = a_sorted[half]
else:
median = (a_sorted[half-1] + a_sorted[half])/2

return float(median)

heap = sorted(log[:days])
res = 0
med = 0
to_del = 0

for ind in range(days, len(log)):
med = median(heap, days)
#print("heap: {}".format(heap))
#print("log[{}] = {} med = {}".format(ind, log[ind], med))

if float(log[ind]) >= 2*med:
res += 1

#del heap[heap.index(log[to_del])]
del heap[index(heap, log[to_del])]
bs.insort(heap, log[ind])
to_del += 1

return res

if __name__ == "__main__":
n, d = input().strip().split(' ')
n, d = [int(n), int(d)]
expenditure = list(map(int, input().strip().split(' ')))
print(result)

### Java

import java.io.*;
import java.util.*;

public class Solution {

public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int d = input.nextInt();
int[] pastActivity = new int[201];

//Wait for d transactions before any notifications
for(int i = 0; i < d; i++)
{
int transaction = input.nextInt();
queue.offer(transaction);
pastActivity[transaction] = pastActivity[transaction]+1;
}

for(int i = 0; i < n-d; i++)
{
int newTransaction = input.nextInt();

//Check if fraudulent activity may have occurred
if(newTransaction >= (2* median(pastActivity, d)))

//Remove the oldest transaction
int oldestTransaction = queue.poll();
pastActivity[oldestTransaction] = pastActivity[oldestTransaction]-1;

queue.offer(newTransaction);
pastActivity[newTransaction] = pastActivity[newTransaction]+1;
}

}

static double median(int[] array, int elements)
{
int index = 0;

if(elements % 2 == 0)//Find median of even # of elements
{
int counter = (elements / 2);

while(counter > 0)
{
counter -= array[index];
index++;
}
index--;//Remove extra iteration
if(counter <= -1)//This index covers both medians
return index;
else//(counter == 0) We need to find the next median index
{
int firstIndex = index;
int secondIndex = index+1;
while(array[secondIndex] == 0)//Find next non-zero transaction
{
secondIndex++;
}
return (double) (firstIndex + secondIndex) / 2.0;//Calculate the average of middle two elements
}
}
else//Find median of odd # of elements
{
int counter = (elements / 2);

while(counter >= 0)
{
counter -= array[index]; index++;
}
return (double) index-1;
}
}

static void printArray(int[] array)
{
System.out.println("Array");
for(int i = 0; i < array.length; i++)
{
if(array[i] > 0)
System.out.println(i+" : "+array[i]);
}
}
}

Note: This problem (Fraudulent Activity Notifications) is generated by HackerRank but the solution is provided by CodingBroz. This tutorial is only for Educational and Learning purpose.