Largest number not exceeding N that does not contain any of the digits of S
Last Updated :
10 Mar, 2023
Given a numberic string N (1 ≤ |N| ≤ 105) and another numeric string S (1 ≤ |S| ≤ 105), the task is to find the maximum number ≤ N such that it doesn’t contain digits of string S. Remove leading zeros, if required.
Note: The string S doesn’t contain ‘0’.
Examples:
Input: N = “2004”, S = “2”
Output: 1999
Explanation:
2004 has digit 2 which is in the string S.
Therefore, keep reducing it by 1 until the number obtained does not contain 2.
Therefore, the largest number that can be obtained is 1999.
Input: N = “12345”, S = “23”
Output: 11999
Naive Approach: For every value of N, check if it contains any of the digits of S. Keep reducing N by 1 until any digit that is present in S does not occur in N.
Implementation:-
C++
#include <bits/stdc++.h>
using namespace std;
bool NotPresent( int i,string s)
{
int temp = stoi(s);
while (i)
{
int digit = i%10;
i/=10;
int t = temp;
while (t)
{
int digit2 = t%10;
t/=10;
if (digit2==digit) return false ;
}
}
return true ;
}
string greatestReducedNumber(string num, string s)
{
int N = stoi(num);
for ( int i=N;i>=1;i--)
{
if (NotPresent(i,s)){
return to_string(i);
}
}
return "-1" ;
}
int main()
{
string N = "12345" ;
string S = "23" ;
cout << greatestReducedNumber(N, S);
return 0;
}
|
Java
import java.util.*;
class GFG {
static boolean NotPresent( int i, String s)
{
int temp = Integer.parseInt(s);
while (i != 0 ) {
int digit = i % 10 ;
i /= 10 ;
int t = temp;
while (t != 0 ) {
int digit2 = t % 10 ;
t /= 10 ;
if (digit2 == digit)
return false ;
}
}
return true ;
}
static String greatestReducedNumber(String num,
String s)
{
int N = Integer.parseInt(num);
for ( int i = N; i >= 1 ; i--) {
if (NotPresent(i, s)) {
return Integer.toString(i);
}
}
return "-1" ;
}
public static void main(String[] args)
{
String N = "12345" ;
String S = "23" ;
System.out.println(greatestReducedNumber(N, S));
}
}
|
Python3
def NotPresent(i, s):
temp = int (s)
while i:
digit = i % 10
i = i / / 10
t = temp
while t:
digit2 = t % 10
t = t / / 10
if digit2 = = digit:
return False
return True
def greatestReducedNumber(num, s):
N = int (num)
for i in range (N, 0 , - 1 ):
if NotPresent(i, s):
return str (i)
return "-1"
if __name__ = = "__main__" :
N = "12345"
S = "23"
print (greatestReducedNumber(N, S))
|
C#
using System;
class GFG
{
static bool NotPresent( int i, string s)
{
int temp = int .Parse(s);
while (i != 0)
{
int digit = i % 10;
i /= 10;
int t = temp;
while (t != 0)
{
int digit2 = t % 10;
t /= 10;
if (digit2 == digit) return false ;
}
}
return true ;
}
static string GreatestReducedNumber( string num, string s)
{
int N = int .Parse(num);
for ( int i = N; i >= 1; i--)
{
if (NotPresent(i, s))
{
return i.ToString();
}
}
return "-1" ;
}
static void Main( string [] args)
{
string N = "12345" ;
string S = "23" ;
Console.WriteLine(GreatestReducedNumber(N, S));
}
}
|
Javascript
function NotPresent(i, s) {
let temp = parseInt(s);
while (i) {
let digit = i % 10;
i = Math.floor(i / 10);
let t = temp;
while (t) {
let digit2 = t % 10;
t = Math.floor(t / 10);
if (digit2 == digit) {
return false ;
}
}
}
return true ;
}
function greatestReducedNumber(num, s) {
let N = parseInt(num);
for (let i = N; i > 0; i--) {
if (NotPresent(i, s)) {
return i.toString();
}
}
return "-1" ;
}
let N = "12345" ;
let S = "23" ;
console.log(greatestReducedNumber(N, S));
|
Time Complexity: O(|N| * log(|N|) * |S|)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized using Hashing. Follow the steps below to solve the problem:
Illustration:
Consider N = “2004” and S = “2”.
To remove 2, it is changed to 1 and the remaining digits are changed to the largest digit which is not present in S, that is digit 9.
- Remove all the leading zeros from the number.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
string greatestReducedNumber(string num, string s)
{
vector< bool > vis_s(10, false );
for ( int i = 0; i < ( int )s.size(); i++) {
vis_s[ int (s[i]) - 48] = true ;
}
int n = num.size();
int in = -1;
for ( int i = 0; i < n; i++) {
if (vis_s[( int )num[i] - '0' ]) {
in = i;
break ;
}
}
if (in == -1) {
return num;
}
for ( char dig = num[in]; dig >= '0' ; dig--) {
if (vis_s[( int )dig - '0' ] == 0) {
num[in] = dig;
break ;
}
}
char LargestDig = '0' ;
for ( char dig = '9' ; dig >= '0' ; dig--) {
if (vis_s[dig - '0' ] == false ) {
LargestDig = dig;
break ;
}
}
for ( int i = in + 1; i < n; i++) {
num[i] = LargestDig;
}
int Count = 0;
for ( int i = 0; i < n; i++) {
if (num[i] == '0' )
Count++;
else
break ;
}
num.erase(0, Count);
if (( int )num.size() == 0)
return "0" ;
return num;
}
int main()
{
string N = "12345" ;
string S = "23" ;
cout << greatestReducedNumber(N, S);
return 0;
}
|
Java
import java.io.*;
import java.util.Arrays;
class GFG {
static String greatestReducedNumber(String num,
String s)
{
Boolean[] vis_s = new Boolean[ 10 ];
Arrays.fill(vis_s, Boolean.FALSE);
for ( int i = 0 ; i < ( int )s.length(); i++) {
vis_s[( int )(s.charAt(i)) - 48 ] = true ;
}
int n = num.length();
int in = - 1 ;
for ( int i = 0 ; i < n; i++) {
if (vis_s[( int )num.charAt(i) - '0' ]) {
in = i;
break ;
}
}
if (in == - 1 ) {
return num;
}
for ( char dig = num.charAt(in); dig >= '0' ; dig--) {
if (vis_s[( int )dig - '0' ] == false ) {
num = num.substring( 0 , in) + dig
+ num.substring(in + 1 , n);
break ;
}
}
char LargestDig = '0' ;
for ( char dig = '9' ; dig >= '0' ; dig--) {
if (vis_s[dig - '0' ] == false ) {
LargestDig = dig;
break ;
}
}
for ( int i = in + 1 ; i < n; i++) {
num = num.substring( 0 , i) + LargestDig;
}
int Count = 0 ;
for ( int i = 0 ; i < n; i++) {
if (num.charAt(i) == '0' )
Count++;
else
break ;
}
num = num.substring(Count, n);
if (( int )num.length() == 0 )
return "0" ;
return num;
}
public static void main(String[] args)
{
String N = "12345" ;
String S = "23" ;
System.out.print(greatestReducedNumber(N, S));
}
}
|
Python3
def greatestReducedNumber(num, s) :
vis_s = [ False ] * 10
for i in range ( len (s)) :
vis_s[( ord )(s[i]) - 48 ] = True
n = len (num)
In = - 1
for i in range (n) :
if (vis_s[ ord (num[i]) - ord ( '0' )]) :
In = i
break
if (In = = - 1 ) :
return num
for dig in range ( ord (num[In]), ord ( '0' ) - 1 , - 1 ) :
if (vis_s[dig - ord ( '0' )] = = False ) :
num = num[ 0 : In] + chr (dig) + num[In + 1 : n - In - 1 ]
break
LargestDig = '0'
for dig in range ( ord ( '9' ), ord ( '0' ) - 1 , - 1 ) :
if (vis_s[dig - ord ( '0' )] = = False ) :
LargestDig = dig
break
for i in range (In + 1 , n) :
num = num[ 0 : i] + chr (LargestDig)
Count = 0
for i in range (n) :
if (num[i] = = '0' ) :
Count + = 1
else :
break
num = num[Count : n]
if ( int ( len (num)) = = 0 ) :
return "0"
return num
N = "12345"
S = "23"
print (greatestReducedNumber(N, S))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static string greatestReducedNumber( string num, string s)
{
bool [] vis_s = new bool [10];
for ( int i = 0; i < ( int )s.Length; i++) {
vis_s[( int )(s[i]) - 48] = true ;
}
int n = num.Length;
int In = -1;
for ( int i = 0; i < n; i++) {
if (vis_s[( int )num[i] - '0' ]) {
In = i;
break ;
}
}
if (In == -1) {
return num;
}
for ( char dig = num[In]; dig >= '0' ; dig--) {
if (vis_s[( int )dig - '0' ] == false ) {
num = num.Substring(0, In) + dig + num.Substring(In + 1, n - In - 1);
break ;
}
}
char LargestDig = '0' ;
for ( char dig = '9' ; dig >= '0' ; dig--) {
if (vis_s[dig - '0' ] == false ) {
LargestDig = dig;
break ;
}
}
for ( int i = In + 1; i < n; i++) {
num = num.Substring(0, i) + LargestDig;
}
int Count = 0;
for ( int i = 0; i < n; i++) {
if (num[i] == '0' )
Count++;
else
break ;
}
num = num.Substring(Count, n);
if (( int )num.Length == 0)
return "0" ;
return num;
}
static void Main() {
string N = "12345" ;
string S = "23" ;
Console.Write(greatestReducedNumber(N, S));
}
}
|
Javascript
<script>
function greatestReducedNumber( num, s){
let vis_s = [ false , false , false , false , false , false , false , false , false , false ];
for (let i = 0; i < s.length; i++) {
vis_s[Number(s[i]) - 48] = true ;
}
let n = num.length;
let inn = -1;
for (let i = 0; i < n; i++) {
if (vis_s[Number(num[i]) - '0' ]) {
inn = i;
break ;
}
}
if (inn == -1) {
return num;
}
for (let dig = String(num[inn]); dig >= '0' ; dig--) {
if (vis_s[Number(dig) - '0' ] == 0) {
num[inn] = dig;
break ;
}
}
let LargestDig = '0' ;
for (let dig = '9' ; dig >= '0' ; dig--) {
if (vis_s[dig - '0' ] == false ) {
LargestDig = dig;
break ;
}
}
for (let i = inn + 1; i < n; i++) {
num[i] = LargestDig;
}
let Count = 0;
for (let i = 0; i < n; i++) {
if (num[i] == '0' )
Count++;
else
break ;
}
num = Number(num).toString();
if (num.length == 0)
return "0" ;
return num;
}
let N = "12345" ;
let S = "23" ;
document.write( greatestReducedNumber(N, S));
</script>
|
Time complexity: O(|N| + |s|)
Auxiliary space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...