Search code examples
c++arraysalgorithmdata-structuresarray-algorithms

least frequent common number from a int array


I have to find least common number from an int array , I have written code but it is not working properly ,

Here is my logic, 1. sort the array 2. get min common counter updated 3. get if all are unique

and the code below,

static int min_loc ; //minimum value location 
static int min_cnt ;
int all_uniqFlag = true;

void leastCommon(int data[],int n)
{
   int rcount = 0; //Repeated number counter
   int mcount = n; // minimum repetetion counter;

   // The array is already sorted we need to only find the least common value. 
   for(int i = 0 ; i < n-1 ; i++)
   {  
      //Case A : 1 1 2 2 2 3 3 3 3 4 5 5 5 5 : result should be 4 
      //Case B : 1 2 3 4 5 6 7 (All unique number and common values so all values should be printed
      //                        and ) 
      //Case C : 1 1 2 2 3 3 4 4 (all numbers have same frequency so need to display all )
      cout << "data[i] : " << data[i] << " data[i+1] : " << data[i+1] <<  "i = " << i << endl;
      if(data[i] != data[i+1])
      {
         //mcount = 0;
         //min_loc = i; 
         //return;
      }
      if(data[i] == data[i+1])
      {
        all_uniqFlag = false;
        rcount++;
      }
      else if(rcount < mcount)
      {
         mcount = rcount;
         min_loc = i ;//data[i];
      }
   } 
   min_cnt = mcount;   
}

As mentioned in the comment only Case B works and Case A and C is not working could you help me fix the issue ?


Solution

    • scan through the list
    • compare each element in the list with the last element in the out array
    • If the element matches, then increment its count by 1
    • If the element doesn't match then add the new element into out array and increment index by 1

    Once the scan is done, the out array will have all the distinct elementsout[][0] and their frequencies out[][1]

    • Scan through the frequency list (out[][1]) to find the lowest frequency
    • Finally do another scan through the element list out[][0] and print elements whose frequency matches with the lowest frequency

    .

    #include<stdio.h>
    #include<stdlib.h>
    #define N 8
    int main()
    {
        //int data[N]={1,2,3,4,5,6,7};
        int data[N]={1,1,2,2,3,3,4,4};
        //int data[N]={1,1,2,2,2,3,3,3,3,4,5,5,5,5};
        int out[N][2];
        int i=0,index=0;
        for(i=0;i<N;i++)
        {
            out[i][0]=0; 
            out[i][1]=0; 
        }
        out[0][0] = data[0];
        out[0][1]=1;
        for(i=1;i<N;i++)
        {
            if(data[i] != out[index][0])
            {
                index++;
                out[index][0] = data[i];
                out[index][1] = 1;
            }
            else
            {
                out[index][1]++;
            }
        }
    
        int min=65536;
        for(i=0;i<N;i++)
        {
            if(out[i][1] == 0)
            {
                break;
            }
            if(out[i][1] < min)
            {
                min = out[i][1];
            }
        }
        for(i=0;i<N;i++)
        {
            if(out[i][1] == min)
            {
                printf("%d\t",out[i][0]);
            }
        }
        printf("\n");
    }