# A. Most Frequent Number Following Key In an Array (opens new window)

Count the occurence of each element.

DETAILS
def mostFrequent(self, A: List[int], key: int) -> int:
        freq = collections.defaultdict(int)
        n = len(A)
        for i in range(1, n):
            if A[i - 1] == key:
                freq[A[i]] += 1
        c = max(freq.values())
        ans = 0
        print(freq)
        for x in list(freq.keys()):
            if freq[x] == c:
                ans = max(ans, x)
        return ans

# B. Sort the Jumbled Numbers (opens new window)

Map integer to string using the given dictionary. Sort by:

  • The value after mapping
  • The original order in A.
DETAILS
def sortJumbled(self, mapping: List[int], A: List[int]) -> List[int]:
        nums = [list(map(int, list(str(x)))) for x in A]
        for num in nums:
            for i in range(len(num)):
                num[i] = mapping[num[i]]
        res = [int("".join(list(map(str, x)))) for x in nums]
        tmp = list(zip(res, list(range(len(A))), A))
        tmp.sort(key = lambda x: [x[0], x[1]])
        return [x[2] for x in tmp]

# C. All Ancestors of a Node in a Directed Acyclic Graph (opens new window)

BFS, start from nodes of 0 indegree.

DETAILS
def getAncestors(self, n: int, A: List[List[int]]) -> List[List[int]]:
        parent, child = collections.defaultdict(set), collections.defaultdict(list)
        ans, indegree, dq = [], [0] * n, collections.deque()
        for a, b in A:
            parent[b].add(a)
            child[a].append(b)
            indegree[b] += 1
        for i in range(n):
            if indegree[i] == 0: dq.append(i)
        while dq:
            curr = dq.popleft()
            for nxt in child[curr]:
                parent[nxt] |= parent[curr]
                indegree[nxt] -= 1
                if indegree[nxt] == 0:
                    dq.append(nxt)
        for i in range(n):
            ans.append(sorted(list(parent[i])))
        return ans

# D. Minimum Number of Moves to Make Palindrome (opens new window)

Greedy.

DETAILS
def minMovesToMakePalindrome(self, s: str) -> int:
        n, s = len(s), list(s)
        l, r, ans = 0, n - 1, 0
        while r > l:
            if s[l] != s[r]:
                kk = r
                while kk > l and s[kk] != s[l]:
                    kk -= 1
                if kk == l:
                    s[l], s[l + 1] = s[l + 1], s[l]
                    ans += 1
                else:
                    while kk < r:
                        s[kk], s[kk + 1] = s[kk + 1], s[kk]
                        ans += 1
                        kk += 1
                    l += 1
                    r -= 1
            else:
                l += 1
                r -= 1
        return ans


func minMovesToMakePalindrome(s string) int {
    n := len(s)
    tmp := []rune(s)
    l, r, ans := 0, n - 1, 0
    for r > l {
        if tmp[l] != tmp[r] {
            kk := r
            for kk > l && tmp[kk] != tmp[l] {
                kk -= 1
            }
            if kk == l {
                tmp[l], tmp[l + 1] = tmp[l + 1], tmp[l]
                ans += 1
            } else {
                for kk < r {
                    tmp[kk], tmp[kk + 1] = tmp[kk + 1], tmp[kk]
                    ans += 1
                    kk += 1
                }
                l += 1
                r -= 1
            }
        } else {
            l += 1
            r -= 1
        }
    }
    return ans
    return 1
}

public:
    int minMovesToMakePalindrome(string s) {
        int s_size = s.size();
        int result = 0;
        int start = 0, end = s_size - 1;
        while (end > start) {
            if (s[start] != s[end]) {
                int i = end; 
                while (i > start && s[i] != s[start]) { 
                    i -= 1; 
                }
                if (i == start) {
                    swap(s[start], s[start + 1]);
                    result += 1;
                }
                else {
                    while (i < end) {
                        swap(s[i], s[i + 1]);
                        result += 1;
                        i += 1;
                    }
                    start += 1; 
                    end -= 1;
                }
            }
            else {
                start += 1; 
                end -= 1;
            }
        }
        return result;
    }