Friday, 28 December 2018

Ciena Interview Experience

Coming Soon

Friday, 15 June 2018

Comma Operator inside for loop Condition in C++

You may have used Comma operator in initilialization and increment part of for loop like below

                 for(init;condition;increment) --> for(int i=0,j=5;i<j;i++,j--)


But can we used Comma operator inside for loop condition ?

The answer is Yes but it behave bit differently.

Predict the output of below program


void commaOperator()
{
    int i=0,j=0;
    cout<<"Using && inside for loop Condition"<<endl;
    for(;i<4&&j<6;)
    {
            cout<<i<<" "<<j<<endl;
            i++;
            j++;
    }
    cout<<"Using comma inside for loop Condition "<<endl;
    i=0,j=0;
    for(;i<4,j<6;)
    {
            cout<<i<<" "<<j<<endl;
            i++;
            j++;
    }

}



Output:
Using && inside for loop Condition
0 0
1 1
2 2
3 3
Using comma inside for loop Condition
0 0
1 1
2 2
3 3
4 4
5 5

As Comma operator is a binary operator it evaluates first operand but discards its result and then evaluates the second operand and returns its result.
In above example , for loop will run till second condition is true (j<6 ) and discards the first condition.

But what if we use comma operator in assignment like below
int a=5,b=7,c;
c=a,b;

Here c will be equal to a (5) as assignment has higher precedence than comma operator.


Please comment if you find anything incorrect.




Saturday, 26 May 2018

Find Consecutive Elements in Unsorted Array in O(n) - C++ Code



#include<iostream>
#include<set>

int findConsecutiveElements(int arr[], int n)
{
        std::set<int> s;
        int ans = 0;

        for (int i = 0; i < n; i++)
                s.insert(arr[i]);

        for (int i=0; i<n; i++)
        {
                if (s.find(arr[i]-1) == s.end())
                {
                        int j = arr[i];
                        while (s.find(j) != s.end())
                                j++;

                        ans = std::max(ans, j - arr[i]);
                }
        }
        return ans;
}

int main()
{
        int arr[] = {1,21, 24, 25, 9, 3, 11, 4, 20, 22,23};
        int n = sizeof arr/ sizeof arr[0];
        std::cout << "Length of the Longest consecutive elements is "
                << findConsecutiveElements(arr, n);
        return 0;
}

Thursday, 30 November 2017

Kth smallest element in a BST - C++ Code


Do inorder Traversal of BST and count number of elements traversed till now . As inorder traversal gives us the element in sorted Order, when count reaches k , we break out and Print the element.


/**
 * Definition for Binary Search Tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 * };
 */
int kthsmallest(TreeNode* root, int k) {
    if(root==NULL)
      return 0;
    stack<TreeNode*> s;
    bool complete=false;
    TreeNode* cur=root;
    int count=0;
    int val=0;
    while(!complete)
    {
        if(cur!=NULL)
        {
            s.push(cur);
            cur=cur->left;
        }
        else
        {
            if(!s.empty())
            {
                count++;
                cur=s.top();
                s.pop();
                if(count==k)
                {
                    val=cur->val;       
      break;
                }
                  cur=cur->right;
            }
            else
              complete=true;
        }  
    }
    return val;
}


Please comment if you find anything incorrect.

Monday, 6 November 2017

First Non Repeating Character in String


#include<iostream>
#include<string>
#include<memory>
#include<climits>
#define NUMBER_OF_CHARS 256
using namespace std;
struct CountIndex
{

 int count;
 int index;
};
char getFirstNonRepeatngCharacter(const string& str)
{
 char ch=' ';
 unique_ptr<CountIndex[]> ci(new CountIndex[256]());
 //Can also use shared_ptr
 //shared_ptr<CountIndex> ci(new CountIndex[256](),std::default_delete<CountIndex[]>());
 for(auto& it:str)
 {
  ci.get()[it].count++;
  if(ci.get()[it].count==1)
   ci.get()[it].index= &it - &str[0];
  else

   ci.get()[it].index= ci.get()[it].index;

 }
 int maxIndex=INT_MAX;

 for(int it=0;it<NUMBER_OF_CHARS;it++)
 {
  if(ci.get()[it].count==1 && ci.get()[it].index <maxIndex)
  {
   maxIndex= ci.get()[it].index;

  }
 }
 return maxIndex!=INT_MAX?str[maxIndex]:' ';
}
int main()
{    
 string str ;
 cin>>str;
 char ch=getFirstNonRepeatngCharacter(str);
 if(ch !=' ')
  cout<<" First Non repeating Character is "<< ch;
 else
  cout<<" No Repeating Character Exist ";


}

Wednesday, 20 September 2017

Folder Organizer

import os,errno
import sys,getopt
def main(argv):
    inputDir=''
    try:
        opts,args= getopt.getopt(argv,"hi:",["iDir="])
    except getopt.GetoptError:
        print 'DirectoryOrganizer.py -i <inputDirectory>'
        sys.exit(2)
    for opt,arg in opts:
        if opt == '-h':
            print 'DirectoryOrganizer.py -i <inputDirectory>'
            sys.exit()
        elif opt in ("-i","--iDir"):
            inputDir=arg
    files= os.listdir(inputDir)
    for file in files:
        extension= os.path.splitext(file)[1][1:]
        if extension:
            fileInputDir =inputDir+extension
            try:
                if not os.path.isdir(fileInputDir):
                    os.makedirs(fileInputDir)
                if not os.path.isfile(fileInputDir+"\\"+file):
                    os.rename(inputDir+file,fileInputDir+"\\"+file)
                else:
                    print "file with same name already exist in folder "+ fileInputDir+"\\"+file
            except OSError as e:
                if e.errno != errno.EEXIST:
                    raise

if __name__ == "__main__":
main(sys.argv[1:])

Wednesday, 13 September 2017

Allocating Void pointer memory using new operator

I was Implementing Generic List in C++ and was able to successfully allocate memory of void*  data using malloc ( malloc return void *) . But how about using new. Can we do below


void Test()
{
           void *f= new void[25];  //void *f=malloc(25); --> Works
           delete f;
}


The Answer is NO.
Because void has no size . How much space has to be allocated is not known.

So if you need to allocate memory using new use operator like


void Test()
{
          void *f=operator new(25);
          delete f;
}