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

4

我在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

长度/2-1处的字符怎么样? - ΦXocę 웃 Пepeúpa ツ
3
将while循环替换为int numberOfDigits = String.valueOf(a1).length(); - rilent
我会将其转换为字符串并获取字符串的中间部分。 - kism3t
2
旁注:您不需要“first”。int middle = last/2; - vefthym
2
@WaqasMahmood 为了记录:我重新措辞了第一段,指出了一个可以简化您的代码的技巧。但是,这仅适用于在此任务中允许使用Math.log10()的情况下。 - GhostCat
显示剩余3条评论
4个回答

9

您也可以一次完成此操作。想法是先将整数存储在另一个变量中,然后在一个整数中向左移动两个数字,而在另一个整数中仅移动一个数字。

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

有趣的方法。 - vefthym
3
现在这就是答案 :) 感谢@Sanket Makani - Waqas Mehmood
2
你在最后一行多打了一个 = - XtremeBaumer
哦,是的,@XtremeBaumer。那就是错误了,感谢你指出来。 - Sanket Makani
2
同意。总是很高兴看到其他人有那个特别的想法,使这个网站变得如此宝贵!我也投票了! - GhostCat
1
太好了!这是一种用于在单次遍历中找到链表中间节点的方法。 - Maxim

8
你的“数学”计算是正确的。唯一可以做的事情是:提前计算你的数字中的“长度”(数字数量),避免两次“迭代”数字 - 这样你就可以确定该数字的位数是偶数还是奇数,而无需“迭代”数字:
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)!


2
System.out.println(str.charAt(str.length() / 2)); 将会打印出正确的值,即在这种情况下是4。 - XtremeBaumer
谢谢回答,我必须在不使用语言方法(如length()、转换为数组或字符串)的情况下完成这个任务。 - Waqas Mehmood
5
好的,我会尽力为你翻译。需要翻译的内容是:“@WaqasMahmood then you should state that in your question”。 - XtremeBaumer
1
@GhostCat既然不允许使用数组,我怀疑他也不允许使用列表,因为它们非常相似。 - 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
这句话需要翻译为:“这个里面有middle吗?你的代码输出了'Yes'。” - Sanket Makani
2
没错。我重新修改了我的答案,加入了一个检查,可以给出你的数字中正确的位数;-) - GhostCat
1
@XtremeBaumer 很好,你开始了自己的回答;那个观点是正确的... 你得到了我的投票。 - GhostCat
@GhostCat 不确定,但我认为 Math 运算也不被允许。除此之外,你的回答很好。 - XtremeBaumer
所以println()也是;-)……if/while也是语言元素。这让我想起了我在大学时用while语言解决问题的日子——它只有一个结构——一个while(bool)循环。那真是太有趣了…… - GhostCat
显示剩余5条评论

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

抱歉,我在问题中忘记提到了,不允许使用语言方法 :) - Waqas Mehmood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接