Update appNew update is available. Click here to update.
Last Updated: 23 Mar, 2021
Strange Numbers
Hard
Problem statement

Alice is very fond of digits. While she was playing with digits from 0 to 9, she noticed that when digits 0, 1, 6, 8, 9 are rotated 180 degrees, they become 0, 1, 9, 8, 6, respectively, and when digits 2, 3, 4, 5, and 7 are rotated 180 degrees, they become invalid.

After noticing such a property of digits, she started considering some numbers as strange numbers. According to her, a strange number is a number that, when rotated 180 degrees in a clockwise fashion, becomes a different number with each digit valid. As she is busy playing with digits, she gave you an integer β€˜N’ and asked you to find the number of strange numbers from 1 to β€˜N’ inclusive.

Note :

The rotated number can be greater(or smaller) than the original number.

Input Format :

The first line of the input contains an integer β€˜T’ representing the number of test cases.

The first line of each test case contains a single integer β€˜N’ denoting the integer given by Alice.

Output Format :

For each test case, print the number of strange numbers between 1 and β€˜N’ inclusive.

The output of each test case will be printed in a separate line.

Note :

You do not need to print anything, it has already been taken care of. Just implement the given function.

Constraints :

1 <= T <= 5
1 <= N <= 10 ^ 5

Time Limit: 1sec
Approaches

01Approach

The idea here is to perform a breadth-first search over all the numbers from 1 to β€˜N’ inclusive with 0, 1, 6, 8, and 9 as their digits. Initially, we will insert all the numbers between 1 to β€˜N’  inclusive having a single - digit with 0 or 1 or 6 or 8 or 9 as their digit into a queue. We will gradually increase the length(i.e., number of digits) of the numbers present in the queue and insert it into the queue if the number lies between 1 to β€˜N’ inclusive. Refer to the below diagram for a clear understanding.

 

For all the numbers present in the queue, we will check if the current number is a strange number.

 

Algorithm:

  • Declare an integer, say β€˜cntStrange’ to count the total number of strange numbers in a given range, and initialize it with 0.
  • Declare an integer, say β€˜currNumber’, to keep track of the current number during our BFS traversal.
  • Declare a queue of integers.
  • Run a loop for β€˜digit’ in [0, 1, 6, 8, 9]:
    • If β€˜digit’ lies between 1 and β€˜N’ inclusive
      • Insert β€˜digit’ into the queue
  • Run a loop until the queue is not empty:
    • Store the front of the queue in β€˜currNumber’ and remove it from the queue.
    • Call the β€˜isStrangeNumber’ function to check if β€˜currNumber’ is a strange number or not.
    • If β€˜currNumber’ is a strange number:
      • Increment β€˜cntStrange’ i.e., do cntStrange = cntStrange + 1.
    • Append digits 0, 1, 6, 8, and 9 to β€˜currNumber’
    • Run a loop for β€˜digit’ in [0, 1, 6, 8, 9]:
      • Declare an integer, say β€˜appendedNumber’
      • Update β€˜appendedNumber’ as β€˜appendedNumber’ = currNumber * 10 + digit
      • If β€˜appendedNumber’ lies between 1 and β€˜N’, inclusive
        • Insert β€˜appendedNumber’ into the queue.
  • Return β€˜cntStrange’.

 

Description of β€˜isStrangeNumber’ function

 

This function is used to check whether the current number is a strange number or not.

 

This function will take one parameter:

  • currNumber: An integer denoting the current number.

 

bool isStrangeNumber(currNumber):

  • Declare a variable β€˜rotatedNumber’ to store the value of β€˜currNumber’ after rotating 180 degrees.
  • Declare a variable β€˜dummy’ and initialize it with β€˜currNumber’.
  • Run a loop while β€˜dummy’ is greater than 0.
    • Declare a variable β€˜currDigit’ and initialize it with the rightmost digit of β€˜dummy’, i.e., do currDigit = dummy % 10.
    • Remove the rightmost digit of β€˜dummy’, i.e., do dummy = dummy / 10
    • If β€˜currDigit’ is 6, then make it 9, or if the β€˜currDigit is 9, make it 6, i.e., rotate the β€˜currDigit’ by 180 degrees.
    • Append the β€˜currDigit’ to β€˜rotatedNumber’ i.e. do rotatedNumber = rotatedNumber * 10 + currDigit.
  • If β€˜currNumber’ is not equal to β€˜rotatedNumber’ then return true,  as the current number follows properties of a strange number.
  • Else return false, as the current number does not follow properties of a strange number as after rotating, the number must be different.