Suppose in a warehouse, there is a row of barcodes. The i-th barcode is barcodes[i]. We have to rearrange the barcodes so that no two adjacent barcodes are same. So if the input is [1,1,1,2,2,2] so output is [2,1,2,1,2,1].
To solve this, we will follow these steps −
- make one map named d
- store the frequency of numbers present in the barcode array into d
- x := empty list
- insert all key-value pairs into x
- i := 0
- res := make a list whose length is same as barcodes, and fill [0]
- sort x based on the frequency
- while i < length of result
- result[i] := element of the last entry of x
- decrease the frequency value of the last entry of x
- if the frequency of the last element of x is 0, then delete that entry from x
- increase i by 2
- i := 1
- while i < length of result
- result[i] := element of the last entry of x
- decrease the frequency value of the last entry of x
- if the frequency of the last element of x is 0, then delete that entry from x
- increase i by 2
- return result
Let us see the following implementation to get better understanding −
Example
class Solution(object): def rearrangeBarcodes(self, barcodes): d = {} for i in barcodes: if i not in d: d[i] = 1 else: d[i]+=1 x = [] for a,b in d.items(): x.append([a,b]) i = 0 result = [0]*len(barcodes) x = sorted(x,key=lambda v:v[1]) while i <len(result): result[i] = x[-1][0] x[-1][1]-=1 if x[-1][1]==0: x.pop() i+=2 i=1 while i <len(result): result[i] = x[-1][0] x[-1][1]-=1 if x[-1][1]==0: x.pop() i+=2 return result ob = Solution() print(ob.rearrangeBarcodes([1,1,1,2,2,2]))
Input
[1,1,1,2,2,2]
Output
[2, 1, 2, 1, 2, 1]