Given a mobile number and some conditions for a fancy number, find if the given number is fancy. A 10-digit mobile number is called fancy if it satisfies any of the following three conditions.
- A single number occurs three consecutive times. Like 777.
- Three consecutive digits are either in increasing or decreasing fashion. Like 456 or 987.
- A single digit occurs four or more times in the number. Like 9859009976 – here the digit 9 occurs 4 times.
Examples:
Input : 9859009976
Output : Yes
The given mobile number satisfies condition three given above.Input : 7609438921
Output : No
None of the given three conditions satisfy.
Idea is to convert number into string using to_string so that it becomes easy to traverse. For condition three to count the frequency of every number a basic concept of string hashing is used.
Source :Oracle Interview Set
Below is the solution to the above problem:
// C++ program to check if a given mobile // number is fancy or not. #include <bits/stdc++.h> using namespace std;
// Returns true if s has three consecutive // same digits. bool cond1(string s)
{ for ( int i = 0; i < s.size() - 2; i++) {
if (s[i] == s[i + 1] && s[i + 1] == s[i + 2])
return true ;
}
return false ;
} // Returns true if s has three increasing or // decreasing digits. bool cond2(string s)
{ for ( int i = 0; i < s.size() - 2; i++) {
if ((s[i] < s[i + 1] && s[i + 1] < s[i + 2]) ||
(s[i] > s[i + 1] && s[i + 1] > s[i + 2]))
return true ;
}
return false ;
} // Checks if a single digit occurs 4 times. bool cond3(string s)
{ int a[10];
memset (a, 0, sizeof (a));
for ( int i = 0; i < s.size(); i++)
a[s[i] - '0' ]++;
for ( int i = 0; i < 10; i++)
if (a[i] >= 4)
return true ;
return false ;
} bool isFancy(string s)
{ if (cond1(s) || cond2(s) || cond3(s))
return true ;
else
return false ;
} // Driver condition int main()
{ long int n = 7609438921;
string s = to_string(n);
if (isFancy(s))
cout << "Yes" ;
else
cout << "No" ;
return 0;
} |
// Java program to check if a given mobile // number is fancy or not. import java.util.*;
import java.lang.*;
import java.io.*;
class GFG {
public static void main(String[] args) {
String mobileNumber = "7654449244" ;
if (isFancy(mobileNumber))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
public static boolean isFancy(String mobileNumber) {
int incrementCount = 0 ;
int decrementCount = 0 ;
int consecutiveCount = 1 ;
int [] countArray = new int [ 10 ];
int prevDigit = - 1 ;
for ( int i = 0 ; i < mobileNumber.length(); i++) {
int digit = Integer.parseInt(String.valueOf(mobileNumber.charAt(i)));
countArray[digit] += 1 ;
// Checking for Number of occurrences of any digit is greater than 3
if (countArray[digit] > 3 )
return true ;
// Checking for consecutive digits are same
if (prevDigit == digit)
consecutiveCount += 1 ;
else if (prevDigit == digit+ 1 && prevDigit != - 1 ) {
incrementCount += 1 ;
decrementCount = 0 ;
consecutiveCount = 1 ;
}
else if (digit == prevDigit+ 1 ) {
decrementCount += 1 ;
incrementCount = 0 ;
consecutiveCount = 1 ;
}
if (consecutiveCount == 3 )
return true ;
if (incrementCount == 2 || decrementCount == 2 )
return true ;
prevDigit = digit;
}
return false ;
}
} // This code is contributed by Vasishta Balla |
# Python3 program to check if a # given mobile number is fancy or not. # Returns true if s has three # consecutive same digits. def cond1(s):
for i in range ( len (s) - 2 ):
if (s[i] = = s[i + 1 ] and
s[i + 1 ] = = s[i + 2 ]):
return True
return False
# Returns true if s has three # increasing or decreasing digits. def cond2(s):
for i in range ( len (s) - 2 ):
if ((s[i] < s[i + 1 ] and
s[i + 1 ] < s[i + 2 ]) or
(s[i] > s[i + 1 ] and
s[i + 1 ] > s[i + 2 ])):
return True
return False
# Checks if a single digit # occurs 4 times. def cond3(s):
a = [ 0 ] * 10
for i in range ( len (s)):
a[s[i] - '0' ] = a[s[i] - '0' ] + 1
for i in range ( len ( 9 )):
if (a[i] > = 4 ):
return True
return False
def isFancy(s):
if (cond1(s) or cond2(s) or cond3(s)):
return True
else :
return False
# Driver condition s = "7609438921"
if (isFancy(s)):
print ( "Yes" )
else :
print ( "No" )
# This code is contributed by ash264 |
// C# program to check if a given mobile // number is fancy or not. using System;
class GFG
{ public static void Main(String[] args)
{
String mobileNumber = "7654449244" ;
if (isFancy(mobileNumber))
{
Console.WriteLine( "Yes" );
}
else
{
Console.WriteLine( "No" );
}
}
public static bool isFancy(String mobileNumber)
{
int incrementCount = 0;
int decrementCount = 0;
int consecutiveCount = 1;
int [] countArray = new int [10];
int prevDigit = -1;
for ( int i = 0; i < mobileNumber.Length; i++)
{
int digit = Int32.Parse(String.Join( "" ,mobileNumber[i]));
countArray[digit] += 1;
// Checking for Number of occurrences
// of any digit is greater than 3
if (countArray[digit] > 3)
{
return true ;
}
// Checking for consecutive digits are same
if (prevDigit == digit)
{
consecutiveCount += 1;
}
else if (prevDigit == digit + 1 && prevDigit != -1)
{
incrementCount += 1;
decrementCount = 0;
consecutiveCount = 1;
}
else if (digit == prevDigit + 1)
{
decrementCount += 1;
incrementCount = 0;
consecutiveCount = 1;
}
if (consecutiveCount == 3)
{
return true ;
}
if (incrementCount == 2 || decrementCount == 2)
{
return true ;
}
prevDigit = digit;
}
return false ;
}
} // This code is contributed by Rajput-Ji |
<script> // Javascript program to check if a given mobile // number is fancy or not // Returns true if s has three consecutive // same digits. function cond1( s)
{ for ( var i = 0; i < s.length - 2; i++) {
if (s[i] == s[i + 1] && s[i + 1] == s[i + 2])
return true ;
}
return false ;
} // Returns true if s has three increasing or // decreasing digits. function cond2( s)
{ for ( var i = 0; i < s.length - 2; i++) {
if ((s[i] < s[i + 1] && s[i + 1] < s[i + 2]) ||
(s[i] > s[i + 1] && s[i + 1] > s[i + 2]))
return true ;
}
return false ;
} // Checks if a single digit occurs 4 times. function cond3( s)
{ var a = new Array(10);
a.fill(0);
for ( var i = 0; i < s.length; i++)
a[s[i] - '0' ]++;
for ( var i = 0; i < 10; i++)
if (a[i] >= 4)
return true ;
return false ;
} function isFancy( s)
{ if (cond1(s) || cond2(s) || cond3(s))
return true ;
else
return false ;
} var n = "7609438921" ;
// var s = to_string(n);
if (isFancy(n))
document.write( "Yes" );
else
document.write( "No" );
// This code is contributed by SoumikMondal </script> |
Yes
Time complexity: O(1) because input string size would be constant i.e., 10.
Auxiliary space: O(1) because it is using constant space.