Open In App

Smallest number greater than K by removing digits from N

Given two integers N and K (K<N), the task is to find the smallest number greater than K by removing digits from N.

Note: You cannot rearrange the digits of N.



Examples:

Input: N = 7182, K = 11
Output: 12
Explanation: Among all the possible combination, 12 is minimum number greater than 11. 



Input: N = 121320, K = 756
Output: 1120
Explanation: Among all the possible combination, 1120 is minimum number greater than 756.

Approach: The basic idea is to 

Find all the subsequences and from the possible numbers get the minimum number that is greater than K.

Follow the steps mentioned below to implement the idea:

Below is the implementation of the above approach.




// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
int ans = 0;
 
// Function to generate all possible combination
void find(int i, vector<int>& digits, int mask, int k)
{
    // Base case
    if (i == digits.size())
        return;
 
    // Store the ans for current state of mask
    int temp = 0;
    int pow_of_10 = 1;
    for (int j = digits.size() - 1; j >= 0; j--) {
        int k = pow(2, j);
 
        // If the bit is 1 means current element
        // is removed in that state
        if (!(mask & k)) {
            temp = temp + pow_of_10 * digits[j];
            pow_of_10 *= 10;
        }
    }
    if (temp > k) {
        ans = min(ans, temp);
    }
    int next = pow(2, i);
    find(i + 1, digits, mask, k);
    find(i + 1, digits, mask | next, k);
}
 
// Function to find number less than N greater than K
int GreaterthanK(int N, int K)
{
    // Array to store digits of N
    vector<int> digits;
    int M = N;
    while (M) {
        digits.push_back(M % 10);
        M /= 10;
    }
    reverse(digits.begin(), digits.end());
    ans = N;
    find(0, digits, 0, K);
    return ans;
}
 
// Driver code
int main()
{
    int N = 121230;
    int K = 756;
 
    // Function call
    cout << (GreaterthanK(N, K)) << endl;
    return 0;
}




// Java code to implement the approach
import java.util.*;
class GFG{
 
static int ans = 0;
 
// Function to generate all possible combination
static void find(int i, ArrayList<Integer> digits , int mask, int k)
{
    // Base case
    if (i == digits.size())
        return;
 
    // Store the ans for current state of mask
    int temp = 0;
    int pow_of_10 = 1;
    for (int j = digits.size() - 1; j >= 0; j--) {
         int kk = (int)Math.pow(2, j);
 
        // If the bit is 1 means current element
        // is removed in that state
        if ((mask & kk)==0) {
            temp = temp + pow_of_10 * digits.get(j);
            pow_of_10 *= 10;
        }
    }
    if (temp > k) {
        ans = Math.min(ans, temp);
    }
    int next = (int)Math.pow(2, i);
    find(i + 1, digits, mask, k);
    find(i + 1, digits, mask | next, k);
}
 
// Function to find number less than N greater than K
static int GreaterthanK(int N, int K)
{
    // Array to store digits of N
    ArrayList<Integer> digits = new ArrayList<Integer>();
    int M = N;
    while (M>0) {
        digits.add(M % 10);
        M /= 10;
    }
    Collections.reverse(digits);
    ans = N;
    find(0, digits, 0, K);
    return ans;
}
 
// Driver code
public static void main(String[] args)
{
    int N = 121230;
    int K = 756;
 
    // Function call
    System.out.println(GreaterthanK(N, K));
}
 
}
// This code is contributed by Pushpesh Raj.




# Python3 code to implement the above approach
ans = 0;
 
# Function to generate all possible combination
def find(i, digits, mask, k) :
    global ans
     
    # Base case
    if (i == len(digits)) :
        return ans;
 
    # Store the ans for current state of mask
    temp = 0;
    pow_of_10 = 1;
     
    for j in range(len(digits) - 1, -1, -1) :
        kk = 2 ** j;
 
        # If the bit is 1 means current element
        # is removed in that state
        if ((mask & kk) == 0) :
            temp = temp + pow_of_10 * digits[j];
            pow_of_10 *= 10;
       
    if (temp > k) :
        ans = min(ans, temp);
 
    next = 2 ** i;
    find(i + 1, digits, mask, k);
     
    tmp = mask | next;
    find(i + 1, digits, tmp, k);
 
# Function to find number less than N greater than K
def GreaterthanK(N, K) :
    global ans
     
    # Array to store digits of N
    digits = [];
    M = N;
    while M > 0:
        digits.append(M % 10);
        M //= 10;
 
    digits.reverse()
    ans = N;
    find(0, digits, 0, K);
    return ans;
 
# Driver code
if __name__ == "__main__" :
 
    N = 121230;
    K = 756;
 
    # Function call
    print(GreaterthanK(N, K));
   
    # This code is contributed by AnkThon




// C# implementation
using System;
using System.Collections.Generic;
public class GFG {
  public static int ans = 0;
 
  // Function to generate all possible combination
  public static void find(int i, List<int> digits,
                          int mask, int k)
  {
    // Base case
    if (i == digits.Count)
      return;
 
    // Store the ans for current state of mask
    int temp = 0;
    int pow_of_10 = 1;
    for (int j = digits.Count - 1; j >= 0; j--) {
      int kk = (int)Math.Pow(2, j);
 
      // If the bit is 1 means current element
      // is removed in that state
      if ((mask & kk) == 0) {
        temp = temp + pow_of_10 * digits[j];
        pow_of_10 *= 10;
      }
    }
    if (temp > k) {
      ans = Math.Min(ans, temp);
    }
    int next = (int)Math.Pow(2, i);
    find(i + 1, digits, mask, k);
    find(i + 1, digits, mask | next, k);
  }
 
  // Function to find number less than N greater than K
  public static int GreaterthanK(int N, int K)
  {
    // Array to store digits of N
    List<int> dig = new List<int>();
    int M = N;
    while (M > 0) {
      int rem = M % 10;
      dig.Add(rem);
      M = (int)(M / 10);
    }
    dig.Reverse();
    ans = N;
    find(0, dig, 0, K);
    return ans;
  }
 
  static public void Main()
  {
    int N = 121230;
    int K = 756;
 
    // Function call
    Console.WriteLine(GreaterthanK(N, K));
  }
}
// this code is contributed by ksam24000




       // JavaScript code for the above approach
 
       let ans = 0;
 
       // Function to generate all possible combination
       function find(i, digits, mask, k) {
           // Base case
           if (i == digits.length)
               return;
 
           // Store the ans for current state of mask
           let temp = 0;
           let pow_of_10 = 1;
           for (let j = digits.length - 1; j >= 0; j--) {
               let k = Math.pow(2, j);
 
               // If the bit is 1 means current element
               // is removed in that state
               if (!(mask & k)) {
                   temp = temp + pow_of_10 * digits[j];
                   pow_of_10 *= 10;
               }
           }
           if (temp > k) {
               ans = Math.min(ans, temp);
           }
           let next = Math.pow(2, i);
           find(i + 1, digits, mask, k);
           find(i + 1, digits, mask | next, k);
       }
 
       // Function to find number less than N greater than K
       function GreaterthanK(N, K) {
           // Array to store digits of N
           let digits = [];
           let M = N;
           while (M) {
               digits.push(M % 10);
               M = Math.floor(M / 10);
           }
           digits.reverse();
           ans = N;
           find(0, digits, 0, K);
           return ans;
       }
 
       // Driver code
       let N = 121230;
       let K = 756;
 
       // Function call
       console.log(GreaterthanK(N, K) + "<br>")
 
// This code is contributed by Potta Lokesh

Output
1120

Time Complexity: O(M * 2M), where M represents the length of N.
Auxiliary Space: O(M)


Article Tags :