Given integers L and R, find all numbers in range L to R whose digits are increasing-decreasing alternatively i.e. if the digits in the current number are d1, d2, d3, d4, d5 . . . then d1 < d2 > d3 < d4. . . must hold true.
Examples:
Input: L = 60, R = 100
Output: 67 68 69 78 79 89
Explanation: These numbers follow the increasing decreasing manner of digitsInput: L = 4, R = 12
Output: 4 5 6 7 8 9 12
Approach: Traverse all numbers in range L to R and find the numbers with given pattern of digits. Follow the steps mentioned below:
- Traverse each digit in the number
- Check if the character on two index ahead is increasing from current character,
- Else check if character on two index ahead is decreasing from current character
- If both the case is false, break and check for next number
- If all cases are true, print the number
Below is the implementation of the above approach.
// C++ code to implement the above approach #include <bits/stdc++.h> using namespace std;
// Utility function to check if // the digits of the current // integer forms a wave pattern bool check( int N)
{ // Convert the number to a string
string S = to_string(N);
// Loop to iterate over digits
for ( int i = 0; i < S.size(); i++) {
if (i == 0) {
// Next character of
// the number
int next = i + 1;
// Current character is
// not a local minimum
if (next < S.size()) {
if (S[i] >= S[next]) {
return false ;
}
}
}
else if (i == S.size() - 1) {
// Previous character of
// the number
int prev = i - 1;
if (prev >= 0) {
// Character is a
// local maximum
if (i & 1) {
// Character is not
// a local maximum
if (S[i] <= S[prev]) {
return false ;
}
}
else {
// Character is a
// local minimum
if (S[i] >= S[prev]) {
return false ;
}
}
}
}
else {
int prev = i - 1;
int next = i + 1;
if (i & 1) {
// Character is a
// local maximum
if ((S[i] > S[prev]) &&
(S[i] > S[next])) {
}
else {
return false ;
}
}
else {
// Character is a
// local minimum
if ((S[i] < S[prev]) &&
(S[i] < S[next])) {
}
else {
return false ;
}
}
}
}
return true ;
} // Function to find the numbers void findNumbers( int L, int R)
{ for ( int i = L; i <= R; i++)
if (check(i))
cout << i << " " ;
} // Driver Code int main()
{ int L = 60, R = 100;
findNumbers(L, R);
return 0;
} |
// Java code to implement the above approach class GFG
{ // Utility function to check if
// the digits of the current
// integer forms a wave pattern
static boolean check( int N)
{
// Convert the number to a string
String S = Integer.toString(N);
// Loop to iterate over digits
for ( int i = 0 ; i < S.length(); i++) {
if (i == 0 ) {
// Next character of
// the number
int next = i + 1 ;
// Current character is
// not a local minimum
if (next < S.length()) {
if (S.charAt(i) >= S.charAt(next)) {
return false ;
}
}
}
else if (i == S.length() - 1 ) {
// Previous character of
// the number
int prev = i - 1 ;
if (prev >= 0 ) {
// Character is a
// local maximum
if ((i & 1 ) > 0 ) {
// Character is not
// a local maximum
if (S.charAt(i) <= S.charAt(prev)) {
return false ;
}
} else {
// Character is a
// local minimum
if (S.charAt(i) >= S.charAt(prev)) {
return false ;
}
}
}
} else {
int prev = i - 1 ;
int next = i + 1 ;
if ((i & 1 ) > 0 ) {
// Character is a
// local maximum
if ((S.charAt(i) > S.charAt(prev)) &&
(S.charAt(i) > S.charAt(next))) {
} else {
return false ;
}
} else {
// Character is a
// local minimum
if ((S.charAt(i) < S.charAt(prev)) &&
(S.charAt(i) < S.charAt(next))) {
} else {
return false ;
}
}
}
}
return true ;
}
// Function to find the numbers
static void findNumbers( int L, int R) {
for ( int i = L; i <= R; i++)
if (check(i))
System.out.print(i + " " );
}
// Driver Code
public static void main(String args[]) {
int L = 60 , R = 100 ;
findNumbers(L, R);
}
} // This code is contributed by gfgking. |
# Python code for the above approach # Utility function to check if # the digits of the current # integer forms a wave pattern def check(N):
# Convert the number to a string
S = str (N);
# Loop to iterate over digits
for i in range ( len (S)):
if (i = = 0 ):
# Next character of
# the number
next = i + 1 ;
# Current character is
# not a local minimum
if ( next < len (S)):
if ( ord (S[i]) > = ord (S[ next ])):
return False ;
elif (i = = len (S) - 1 ):
# Previous character of
# the number
prev = i - 1 ;
if (prev > = 0 ):
# Character is a
# local maximum
if (i & 1 ):
# Character is not
# a local maximum
if ( ord (S[i]) < = ord (S[prev])):
return False ;
else :
# Character is a
# local minimum
if ( ord (S[i]) > = ord (S[prev])):
return False ;
else :
prev = i - 1 ;
next = i + 1 ;
if (i & 1 ):
# Character is a
# local maximum
if ( ord (S[i]) > ord (S[prev])) and ( ord (S[i]) > ord (S[ next ])):
print (" ", end=" ")
else :
return False ;
else :
# Character is a
# local minimum
if ( ord (S[i]) < ord (S[prev])) and ( ord (S[i]) < ord (S[ next ])):
print (" ", end=" ")
else :
return False ;
return True ;
# Function to find the numbers def findNumbers(L, R):
for i in range (L, R + 1 ):
if (check(i)):
print (i, end = " " )
# Driver Code L = 60
R = 100 ;
findNumbers(L, R); # This code is contributed by Saurabh Jaiswal |
// C# code to implement the above approach using System;
class GFG
{ // Utility function to check if
// the digits of the current
// integer forms a wave pattern
static bool check( int N)
{
// Convert the number to a string
string S = N.ToString();
// Loop to iterate over digits
for ( int i = 0; i < S.Length; i++) {
if (i == 0) {
// Next character of
// the number
int next = i + 1;
// Current character is
// not a local minimum
if (next < S.Length) {
if (S[i] >= S[next]) {
return false ;
}
}
}
else if (i == S.Length - 1) {
// Previous character of
// the number
int prev = i - 1;
if (prev >= 0) {
// Character is a
// local maximum
if ((i & 1) > 0) {
// Character is not
// a local maximum
if (S[i] <= S[prev]) {
return false ;
}
}
else {
// Character is a
// local minimum
if (S[i] >= S[prev]) {
return false ;
}
}
}
}
else {
int prev = i - 1;
int next = i + 1;
if ((i & 1) > 0) {
// Character is a
// local maximum
if ((S[i] > S[prev]) &&
(S[i] > S[next])) {
}
else {
return false ;
}
}
else {
// Character is a
// local minimum
if ((S[i] < S[prev]) &&
(S[i] < S[next])) {
}
else {
return false ;
}
}
}
}
return true ;
}
// Function to find the numbers
static void findNumbers( int L, int R)
{
for ( int i = L; i <= R; i++)
if (check(i))
Console.Write(i + " " );
}
// Driver Code
public static void Main()
{
int L = 60, R = 100;
findNumbers(L, R);
}
} // This code is contributed by Samim Hossain Monda |
<script> // JavaScript code for the above approach
// Utility function to check if
// the digits of the current
// integer forms a wave pattern
function check(N)
{
// Convert the number to a string
let S = N.toString();
// Loop to iterate over digits
for (let i = 0; i < S.length; i++)
{
if (i == 0)
{
// Next character of
// the number
let next = i + 1;
// Current character is
// not a local minimum
if (next < S.length)
{
if (S[i].charCodeAt(0) >= S[next].charCodeAt(0))
{
return false ;
}
}
}
else if (i == S.length - 1)
{
// Previous character of
// the number
let prev = i - 1;
if (prev >= 0) {
// Character is a
// local maximum
if (i & 1) {
// Character is not
// a local maximum
if (S[i].charCodeAt(0) <= S[prev].charCodeAt(0)) {
return false ;
}
}
else {
// Character is a
// local minimum
if (S[i].charCodeAt(0) >= S[prev].charCodeAt(0)) {
return false ;
}
}
}
}
else {
let prev = i - 1;
let next = i + 1;
if (i & 1) {
// Character is a
// local maximum
if ((S[i].charCodeAt(0) > S[prev].charCodeAt(0)) &&
(S[i].charCodeAt(0) > S[next].charCodeAt(0))) {
}
else {
return false ;
}
}
else {
// Character is a
// local minimum
if ((S[i].charCodeAt(0) < S[prev].charCodeAt(0)) &&
(S[i].charCodeAt(0) < S[next].charCodeAt(0))) {
}
else {
return false ;
}
}
}
}
return true ;
}
// Function to find the numbers
function findNumbers(L, R) {
for (let i = L; i <= R; i++)
if (check(i))
document.write(i + " " )
}
// Driver Code
let L = 60, R = 100;
findNumbers(L, R);
// This code is contributed by Potta Lokesh
</script>
|
67 68 69 78 79 89
Time Complexity: O((R-L) * D) where D is the number of digits in R
Auxiliary Space: O(D)