在Java中查找整数中的中间数字

在Java中查找整数中的中间数字,java,performance,Java,Performance,我在java“1234567”中有一个整数,我的程序在一组整数中找到中间数字,有没有比下面的代码更优化的方法?。最近在java采访中被问到 我所做的是首先找到数字、第一、最后和中间索引的编号。然后在同一个整数上迭代找到中间数字。请建议一些优化 int a1 = 1234567; int a = a1; // calculate length int noOfDigits = 0; while(a!=0) { a = a/10; noOfDigits++; } int first

我在java“1234567”中有一个整数,我的程序在一组整数中找到中间数字,有没有比下面的代码更优化的方法?。最近在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
你的“数学”是正确的。您可以做的一件事是:计算数字中的长度(位数),以避免将数字“迭代”两次-因此您可以确定该位数是偶数还是奇数,而无需对数字进行“迭代”:

int n = 1234;
int length = (int)(Math.log10(n)+1);
1234应该给你4分,12345应该给你5分

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

String asStr = Integer.toString(123456);
现在:您可以轻松地检查该字符串的长度;并且您可以直接访问相应的字符


唯一需要记住的是:表示数字的字符,如“1”、“2”。。。具有不同的数值,如int 1,2。。。(请参阅ASCII表格;因为“1”的数值为49)

这个答案的代码更少,但性能不会太高,我认为:

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");
}
inta1=12334;
int a=a1;
int-middle=0;
int noOfDigits=0;
而(a1!=0){
a1=a1/10;
noOfDigits++;
}
如果(无数字%2==1){
对于(int i=0;i<(noOfDigits/2)+1;i++){
中间=a%10;
a=a/10;
}
System.out.println(中间);
}否则{
System.out.println(“无中间存在”);
}
仅使用数学

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

你也可以一次完成。其思想是首先将
整数
存储在另一个变量中。然后在一个
整数中向左移动两位,而在另一个整数中只移动一位

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


长度为/2-1的字符如何?int numberOfDigits=String.valueOf(a1.length();而不是while循环,我将转换为String并获取字符串的中间一个。旁注:您不需要先
<代码>整数中间=最后一个/2@WaqasMahmood:我改写了第一段,指出了简化代码的一个技巧。但是,只有在允许您使用Math.log10()进行此赋值的情况下,这才有效。
System.out.println(str.charAt(str.length()/2))
将打印正确的值,即4在这种情况下感谢您的回答,我必须在不使用诸如length()之类的语言方法或将其转换为array或string@WaqasMahmood那么你应该在你的报告中说明这一点question@GhostCat因为他不允许使用数组,我怀疑他是否被允许使用列表,因为它们是相当相等的
a1=1233
。这里面有中间派吗?您的代码打印出
。是的,这不是最好的检查。但与op USE相同,数字长度检查在决定是否存在mid时是正确的,因为@GhostCat发布了..正确。我重新修改了我的答案,在上面加了一张支票,上面的数字是正确的;-)@很好,你开始了自己的答案;这一点是正确的。。。我投你一票,抱歉。。我忘了在我的问题中提到,语言方法是不允许的:)有趣的方法。现在这就是答案:)谢谢@Sanket Makaniyou在最后一行有一个
=
太多了哦,是的,@XtremeBaumer。那是个错误,谢谢你指出。同意。总是很高兴看到其他人有这个特别的想法,使这个网站如此有价值!我也要投票!