code.ashish.me

Atom feed

Recently added: 128 Longest Consecutive Sequence, 347 Top K Frequent Elements, 045 Jump Game 2, 228 Summary Ranges, 219 Contains Duplicate 2

811 Subdomain Visit Count

/**
 *
 * Ashish Patel
 * e: ashishsushilPatel@gmail.com
 * w: https://ashish.me
 *
 */

/*
 * A website domain like "discuss.leetcode.com" consists of various subdomains.
 * At the top level, we have "com", at the next level, we have "leetcode.com",
 * and at the lowest level, "discuss.leetcode.com". When we visit a domain
 * like "discuss.leetcode.com", we will also visit the parent domains
 * "leetcode.com" and "com" implicitly.
 *
 * Now, call a "count-paired domain" to be a count (representing the number of
 * visits this domain received), followed by a space, followed by the address.
 * An example of a count-paired domain might be "9001 discuss.leetcode.com".
 *
 * We are given a list cpdomains of count-paired domains. We would like a list
 * of count-paired domains, (in the same format as the input, and in any order),
 * that explicitly counts the number of visits to each subdomain.
 *
 * Example 1:
 * Input:
 * ["9001 discuss.leetcode.com"]
 * Output:
 * ["9001 discuss.leetcode.com", "9001 leetcode.com", "9001 com"]
 * Explanation:
 * We only have one website domain: "discuss.leetcode.com". As discussed above,
 * the subdomain "leetcode.com" and "com" will also be visited. So they will
 * all be visited 9001 times.
 */

function subdomainVisitCount(domains) {
  let cache = {}
  let result = []
  for (let i = 0; i < domains.length; i++) {
    const count = Number(domains[i].split(' ')[0])    
    const domain = domains[i].split(' ')[1]
    const subdomains = domain.split('.')
    let subdomain = subdomains[subdomains.length - 1]
    cache[subdomain] = (cache[subdomain] || 0) + count
    for (let i = subdomains.length - 2; i >= 0; i--) {
      subdomain = subdomains[i] + '.' + subdomain
      cache[subdomain] = (cache[subdomain] || 0) + count
    }
  }

  for (const key in cache) {
    result.push(`${cache[key]} ${key}`)
  }
  return result.sort()
}

test('subdomain Visit Count', () => {
  expect(subdomainVisitCount(['9001 discuss.leetcode.com'])).toEqual([
    '9001 discuss.leetcode.com',
    '9001 leetcode.com',
    '9001 com',
  ].sort())
})

Created 2020-04-25T22:07:19+00:00 · Edit