Generate an array of size N according to the given rules

Given a number N, the task is to create an array arr[] of size N, where the value of the element at every index i is filled according to the following rules:

  1. arr[i] = ((i – 1) – k), where k is the index of arr[i – 1] that has appeared second most recently. This rule is applied when arr[i – 1] is present more than once in the array
  2. arr[i] = 0. This rule is applied when arr[i – 1] is present only once or when i = 1.

Examples:

Input: N = 8
Output: 0 0 1 0 2 0 2 2
Explanation:
For i = 0: There is no element in the array arr[]. So, 0 is placed in the first index. arr[] = {0}.
For i = 1: There is only one element in the array arr[]. The occurrence of arr[i – 1] (= 0) is only one. Therefore, the array is filled according to the rule 2. arr = {0, 0}.
For i = 2: There are two elements in the array. The second most occurrence of arr[i – 1] = arr[0] = 0. So, arr[2] = 1. arr[] = {0, 0, 1}.
For i = 3: There is no second occurrence of arr[i – 1] = 1. Therefore, arr[3] = 0. arr[] = {0, 0, 1, 0}
For i = 4: The second recent occurrence of arr[i – 1] = 0 is 1. Therefore, (i – 1 – k) = (4 – 1 – 1) = 2. arr[] = {0, 0, 1, 0, 2}.
For i = 5: There is only one occurrence of arr[i – 1] = 2. Therefore, arr[5] = 0. arr[] = {0, 0, 1, 0, 2, 0}.
For i = 6: The second recent occurrence of arr[i – 1] = 0 is 3. Therefore, (i – 1 – k) = (6 – 1 – 3) = 2. arr[] = {0, 0, 1, 0, 2, 0, 2}.
For i = 7: The second recent occurrence of arr[i – 1] = 2 is 4. Therefore, (i – 1 – k) = (7 – 1 – 4) = 2. arr[] = {0, 0, 1, 0, 2, 0, 2, 2}



Input: N = 5
Output: 0 0 1 0 2

Approach: The idea is to first create an array filled with zeroes of size N. Then for every iteration, we search if the element has occurred in the near past. If yes, then we follow rule 1. Else, rule 2 is followed to fill the array.

Below is the implementation of the above approach:

Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java implementation to generate 
// an array of size N by following 
// the given rules
class GFG 
{
  
static int a[];
  
// Function to search the most recent 
// location of element N 
// If not present in the array 
// it will return -1 
static int search(int a[],int k, int x)
{
    int j;
      
    for ( j = k - 1; j > -1 ; j--)
    {
            if(a[j] == x)
                return j ;
        }
                  
        return -1 ;
}
  
// Function to generate an array 
// of size N by following the given rules 
static void genArray(int []arr, int N)
  
    // Loop to fill the array 
    // as per the given rules 
    for(int i = 0; i < N - 1; i++)
    
  
        // Check for the occurrence 
        // of arr[i - 1] 
        if(search(arr, i, arr[i]) == -1)
                arr[i + 1] = 0 ;
  
        else
            arr[i + 1] = (i-search(arr, i, arr[i])) ;
    }
  
// Driver code 
public static void main (String[] args) 
{
    int N = 5 ;
    int size = N + 1 ;
    int a[] = new int [N]; 
    genArray(a, N) ;
      
    for (int i = 0; i < N ; i ++)
        System.out.print(a[i]+" " );
  
}
}
  
// This code is contributed by Yash_R

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation to generate 
# an array of size N by following 
# the given rules
  
  
# Function to search the most recent 
# location of element N
# If not present in the array 
# it will return -1
def search(a, k, x):
        for j in range(k-1, -1, -1) :
            if(a[j]== x):
                return j
                  
        return -1
  
# Function to generate an array 
# of size N by following the given rules
def genArray(arr, N):
  
    # Loop to fill the array
    # as per the given rules
    for i in range(0, N-1, 1):
  
        # Check for the occurrence 
        # of arr[i - 1]
        if(search(arr, i, arr[i])==-1):
                arr[i + 1]= 0
  
        else:
            arr[i + 1]=(i-search(arr, i, arr[i]))
              
# Driver code      
if __name__ == "__main__":
    N = 5
    size = N + 1
    a =[0]*N
    genArray(a, N)
      
    print(a)

chevron_right


Output:

[0, 0, 1, 0, 2]



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Yash_R