Waqas Mehmood
Waqas Mehmood

Reputation: 135

Find middle digit in an integer in Java

I have an integer in java "1234567" and my program finds middle digit in a set of integer, is there more optimized way than below code?. Recently asked in java interview.

What I have done is first find no of digits, first, last and middle indexes. Then find middle digit again iterating on same integer. Please advice some optimization.

int a1 = 1234567;
int a = a1;

// calculate length
int noOfDigits = 0;
while(a!=0)
{
   a = a/10;
   noOfDigits++;
}

int first = 0;
int last = noOfDigits-1;
int middle = (first+last)/2;

boolean midExists = ((a1%2)==1);
System.out.println(" digits: "+a1);
System.out.println(" no of digits "+noOfDigits);
System.out.println(" first "+first);
System.out.println(" last " + last);

if(midExists)
{
   System.out.println(" middle " + middle);
   int i = last;
   int middleDigit = 0;
   a = a1;
   while(i != middle)
   {
     a = (a / 10);
     middleDigit = (a%10);
     i--;
   }
   System.out.println("middle digit: " + middleDigit);
 }
 else
   System.out.println(" Mid not Exists.. ");

Program Output:

digits: 1234567
no of digits 7
first 0
last 6
middle 3
middle digit: 4

Upvotes: 4

Views: 16649

Answers (4)

Sanket Makani
Sanket Makani

Reputation: 2489

You can also do this in one pass. Idea is that first store the integer in the another variable. Then move two digits to the left in one integer while only one digit in the another one.

int a1 = 1234567;  
int a2 = a1;
int flag=0;

while(a2>0)
{
    a2/=10;               //Moves to the left by one digit
    if(a2==0)             //If there are odd no. of digits
    {
        flag=1;
        break;
    }
    a2/=10;               //Moves to the left by one digit
    a1/=10;               //Moves to the left by one digit
}
System.out.print(flag!=1?"No Mid Exists":a1%10);

Upvotes: 9

XtremeBaumer
XtremeBaumer

Reputation: 6435

this answer has less code, but wouldn't take much in performance i think:

int a1 = 12334;
int a = a1;
int middle = 0;
int noOfDigits = 0;

while (a1 != 0) {
    a1 = a1 / 10;
    noOfDigits++;
}
if (noOfDigits % 2 == 1) {
    for (int i = 0; i < (noOfDigits / 2) + 1; i++) {
        middle = a % 10;
        a = a / 10;
    }
    System.out.println(middle);
} else {
    System.out.println("No mid existing");
}

Upvotes: 4

GhostCat
GhostCat

Reputation: 140427

Your "math" is working correctly. The one thing you can: compute the length (number of digits) within your number upfront, to avoid "iterating" the number twice - so you can determine if that number of digits is even or odd without "iterating" the number:

int n = 1234;
int length = (int)(Math.log10(n)+1);

should give you 4 for 1234, and 5 for 12345.

But beyond that: you can express information in different ways. For example: you can turn an int value into a string.

String asStr = Integer.toString(123456);

And now: you can easily check the length of that string; and you can directly access the corresponding character!

The only thing to keep in mind: characters representing numbers like '1', '2', ... have different numerical values as int 1, 2, ... (see an ASCII table; as '1' is 49 when regarding its numerical value)!

Upvotes: 8

Using only math

int num = 123406789;
int countDigits = (int)Math.ceil(Math.log10(num));
int midIndex = (int)Math.ceil(countDigits/2);
int x = num / (int)Math.pow(10, midIndex);
int middleDigit = x % 10;
System.out.println(middleDigit);

Upvotes: 1

Related Questions