Ads Conversion Rate

// The people who buy ads on our network don't have enough data about how ads are working for
//their business. They've asked us to find out which ads produce the most purchases on their website.

// Our client provided us with a list of user IDs of customers who bought something on a landing page
//after clicking one of their ads:

// # Each user completed 1 purchase.
// completed_purchase_user_ids = [
//   "3123122444","234111110", "8321125440", "99911063"]

// And our ops team provided us with some raw log data from our ad server showing every time a
//user clicked on one of our ads:
// ad_clicks = [
//  #"IP_Address,Time,Ad_Text",
//  "122.121.0.1,2016-11-03 11:41:19,Buy wool coats for your pets",
//  "96.3.199.11,2016-10-15 20:18:31,2017 Pet Mittens",
//  "122.121.0.250,2016-11-01 06:13:13,The Best Hollywood Coats",
//  "82.1.106.8,2016-11-12 23:05:14,Buy wool coats for your pets",
//  "92.130.6.144,2017-01-01 03:18:55,Buy wool coats for your pets",
//  "92.130.6.145,2017-01-01 03:18:55,2017 Pet Mittens",
//]
       
//The client also sent over the IP addresses of all their users.
       
//all_user_ips = [
//  #"User_ID,IP_Address",
//   "2339985511,122.121.0.155",
//  "234111110,122.121.0.1",
//  "3123122444,92.130.6.145",
//  "39471289472,2001:0db8:ac10:fe01:0000:0000:0000:0000",
//  "8321125440,82.1.106.8",
//  "99911063,92.130.6.144"
//]
       
// Write a function to parse this data, determine how many times each ad was clicked,
//then return the ad text, that ad's number of clicks, and how many of those ad clicks
//were from users who made a purchase.


// Expected output:
// Bought Clicked Ad Text
// 1 of 2  2017 Pet Mittens
// 0 of 1  The Best Hollywood Coats
// 3 of 3  Buy wool coats for your pets

Solution:

 public List<String> adsConversionRate(String[] completedPurchaseUserIds, String[] adClicks, String[] allUserIps)
    {
        Map<String, int[]> resultMap = new HashMap<>();
        Map<String, String> userIpMap = new HashMap<>();
        // ip --> adtitle
        Map<String, String> ipToTitle = new HashMap<>();

        for(int i = 0; i< allUserIps.length; i++)
        {
            Stirng[] element = allUserIps[i].split(",");
            // userId --> ip
            userIpMap.put(element[0], element[1]);
        }


        for(int i = 0; i< adClicks.length; i++)
        {
            String[] clicksArray = adClicks[i].split(",");
            String adTitle = clicksArray[2];
            if(!resultMap.containsKey(adTitle))
            {
                int[] purchaseOfClick = new int[2];
                purchaseOfClick[1] = 1; 
                resultMap.put(adTitle, purchaseOfClick);
            }
            else
            {
                int[] purchaseOfClick = resultMap.get(adTitle);
                purchaseOfClick[1]++;
                resultMap.put(adTitle, purchaseOfClick);
            }
            
            // ip --> titile
            ipToTitle.put(clicksArray[0], adTitle);
        }


       for(int i = 0; i< completedPurchaseUserIds.length; i++)
       {
            String purchasedIp = userIpMap.get(completedPurchaseUserIds[i]);
            String title = ipToTitle.get(purchasedIp);
            int[] purchaseHelper = resultMap.get(title);
            purchaseHelper[0]++;
            resultMap.put(title, purchaseHelper);
       }
    }

**

   public Map<String, int[]> adsConversionRate(String[] completedPurchaseUserIds, 
                                               String[] adClicks, 
                                               String[] allUserIps)
    {
        // int[0] is purchase, int[1] is click
        Map<String, int[]> resultMap = new HashMap<>();
        // userId --> ip
        Map<String, String> userIpMap = new HashMap<>();
        Set<String> useIds = new HashSet<>(completedPurchaseUserIds);

        for(int i = 0; i< allUserIps.length; i++)
        {
            Stirng[] element = allUserIps[i].split(",");
            // userId --> ip
            userIpMap.put(element[0], element[1]);
        }

        for(int i = 0; i< adClicks.length; i++)
        {
            String[] clicksArray = adClicks[i].split(",");
            String ip = clicksArray[0];
            String adTitle = clicksArray[2];
            
            if(!resultMap.containsKey(adTitle))
            {
                int[] purchaseOfClick = new int[2];
                purchaseOfClick[0] = useIds.contains(userIpMap.get(ip)) ? 1 : 0;
                purchaseOfClick[1] = 1; 
                resultMap.put(adTitle, purchaseOfClick);                
            }
            else
            {
                int[] purchaseOfClick = resultMap.get(adTitle);
                if(useIds.contains(userIpMap.get(ip)))
                {
                    purchaseOfClick[0]++;
                }
                purchaseOfClick[1]++;
                resultMap.put(adTitle, purchaseOfClick);
            }
        }
        return resultMap;
    }

Last updated