Day  1

Day 1

I started a day with Problem of the day in GeeksforGeeks. The coding question was named "Remove K Digits". it is a stack problem.

Problem statement:

Given a non-negative integer S represented as a string, remove K digits from the number so that the new number is the smallest possible.
Note : The given num does not contain any leading zero.

SAMPLE

Input:
S = "149811", K = 3
Output: 
111
Explanation: 
Remove the three digits 
4, 9, and 8 to form the new number 111
which is smallest.

Problem Explanation and problem Approach

S is the string containing a number and we have to remove K digits from the S such that the remaining numbers can form a smallest number possible.

I used stack to solve this problem, traverse complete string using a for loop.... Inside for loop we have a while loop whose condition is stack should not be empty , the top element of stack should be greater than index and k should be greater than zero.

inside while loop we remove the top element of stack and reduce the k by 1. Outside while loop we push element in the stack.

End of for loop we have to check if we have removed k or not if not we pop the top elements and finally we would have remove k elements. so now start while loop and save the remaining in a string. After end of while loop we will have a reverse string, I used reverse builtin function to reverse the string.

This is not the end of the solution we forgot a case where there is a leading zeros and we need to remove those zeros, for that we start traversing from that index 0 and keep on moving ahead until we get a char which is not '0' and we return a sub string from that index using substr builtin function.

CODE

string removeKdigits(string S, int k) {
  if(k>S.size()) //border case
      return "0";
  stack<char>st;
  for(int i=0;i<S.size();i++)
  {
      while(!st.empty() && st.top()>S[i] && k>0){ //if top ele is greater then ele
         st.pop();
         k--;
      }
      st.push(S[i]);
  }
  if(st.empty()) //if st is empty then return 0;
       return "0";
  while(k--) //if k is still not 0 then remove remaining elements.
    st.pop();
    string res; // storing the stack ele in string.
    while(!st.empty()){
      res.push_back(st.top());
      st.pop();
    }
    reverse(res.begin(),res.end());
    int i=0;
    while(res[i]=='0') //remove leading zeros
      i++;
    if(i==res.size())
      return "0";
    return res.substr(i);   //here it returns from ith index to the end of string.
    }

Next question

Problem statement: Given an integer N and an integer D, rotate the binary representation of the integer N by D digits to the left as well as right and return the results in their decimal representation after each of the rotation.
Note: Integer N is stored using 16 bits. i.e. 12 will be stored as 0000000000001100.

Input:
N = 28, D = 2
Output:
112
7
Explanation: 
28 in Binary is: 0000000000011100
Rotating left by 2 positions, it becomes 0000000001110000 = 112 (in decimal).
Rotating right by 2 positions, it becomes 0000000000000111 = 7 (in decimal).

we are given 2 integers n and d where we have to convert n into binary representation and shift the bits left and right by d places. finally we have to return a vector containing decimal value of left and right rotated bits. For this we are taking bits of size 16 as we are considering bits of 16 places(given in question) and 2 variables to store left rotated value and right rotated value.

To convert number N to decimal to bits we use for loop from index 0 to 16 then in each array slot we will have 0 or 1 by taking n%2 and then divide n by 2 .

we will take another variable sum, then we start a for loop where initial value of i is (16-d) because after shifting elements by d times the first element in 2^0 position is (16-d)%16 and j starts from 0 till 16. inside the loop we check if bits[i] is equal to 1 if it's true add sum to the left, where sum is the decimal converted part of a binary represented digit.

similarly we do it for the right shift also, then push it to the vector and return the vector.

vector <int> rotate (int n, int d)
        {
            int left=0,right=0,bits[16];
            int i,j;
            d=d%16;
            for(i=0;i<16;i++) //converting decimal to binary
            {
                bits[i]=n%2;
                n=n/2;
            }
            int sum=1;
            for(i=(16-d)%16,j=0;j<16;j++,i=(i+1)%16) 
            { //when shifting left the first ele(2^0 ele) is (16-d)%16
                if(bits[i]==1)
                {
                    left=left+sum;
                }
                sum=sum*2;
            }
            sum=1;
            for(i=d,j=0;j<16;j++,i=(i+1)%16)
            {//when shifting right the first ele(2^0 ele) is d
                if(bits[i]==1)
                    right=right+sum;
                sum=sum*2;
            }
            vector<int>ans;
            ans.push_back(left);
            ans.push_back(right);
            return ans;
        }

Today while browsing Youtube I came across Dynamic programming by Aditya verma and I want to start learning through it. I want to complete the playlist in a month. Is it possible?? lets see.....

For the Outdoor activity I walked for 30 mins. yeah I know it's less but wanted to start slow.