2017-05-05 90 views
4

我在java“1234567”中有一个整数,我的程序在一组整数中找到中间数字,有没有比下面的代码更优化的方式?最近在java面试中问到。在Java中找到一个整数的中间数字

我所做的是先找到数字,第一,最后和中间索引号。然后再次找到中间数字迭代在相同的整数。请建议一些优化。

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.. "); 

程序的输出:

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

char/length?2-1? –

+3

int numberOfDigits = String.valueOf(a1).length();而不是while循环 – rilent

+0

我将转换为字符串并获取字符串的中间一个。 – kism3t

回答

8

你也可以做到这一点的一个通行证。想法是,首先将integer存储在另一个变量中。然后在一个integer的左侧移动两个数字,而另一个数字只有一个数字。

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); 
+0

有趣的做法。 – vefthym

+3

现在,这是答案:)谢谢@Sanket Makani –

+2

你在最后一行有一个'='太多 – XtremeBaumer

9

你的 “数学” 工作正常。有一两件事你可以:计算长度你的电话号码前期,避免“迭代”数量的两倍之内(中位数) - 让您可以或确定的数字,这个数字是偶奇没有“迭代“数量:

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

应该给你4 1234,5 12345

但除此之外:你可以表达不同的方式的信息。例如:您可以将一个int值转换为一个字符串。

String asStr = Integer.toString(123456); 

现在:您可以轻松地检查长度字符串;你可以直接访问相应的字符!

唯一要记住的是:表示数字如'1','2',...的字符有不同数值为int 1,2,...(请参见ASCII表; 1'在其数值为49时)!

+2

'System.out.println(str.charAt(str.length()/ 2));'会输出正确的值,即4在这种情况下 – XtremeBaumer

+0

感谢您的答案,我必须做到这一点,而不使用像length()这样的语言方法,或者将其转换为数组或字符串 –

+5

@WaqasMahmood,那么你应该在你的问题 – XtremeBaumer

4

这个答案有更少的代码,但不会采取太多的表现,我认为:

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"); 
} 
+3

'a1 = 1233'。中间是否存在这个?你的代码打印'是'。 –

+0

耶不是最好的支票。但与op使用相同 – XtremeBaumer

+0

noOfDigits长度检查是否正确,以中间存在或不存在为准@GhostCat发布.. –

1

只使用数学

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); 
+1

我猜数学方法不允许... – vefthym

+0

道歉..我忘记提及,在我的问题中,语言方法不允许:) –

相关问题