【问题标题】:why this method doesn't return true?为什么这个方法不返回true?
【发布时间】:2019-06-29 11:14:57
【问题描述】:

我有以下任务要做: 编写一个方法,获取一个数组作为参数和一个 int 数。 如果数组中的 2 个数字之间的差异大于数字变量值,则该方法返回 true。 请注意,您只能循环数组一次。 所以我写道:

public class difference
{
    public boolean difference(int[] a, int x)
    {
        int firstNum=a[0];//3
        boolean answer=false;
        for (int i=1;i<a.length;i++)
        {
            if (Math.abs(firstNum)-(Math.abs(a[i]))>Math.abs(x)) {
                answer=true;  
                break;  
            }
        }
        return answer;
    }
    public static void main(String[]args)
    {
        difference test= new difference();
        int[] array={3,4,6};
        System.out.println(test.difference(array,0));
    }
}

但由于某种原因,这将我打印为 false 而不是 true 为什么?

【问题讨论】:

  • 您的主要问题是您在每个数字上使用Math.abs 而不是在差异上,因此您正在与负数进行比较。但无论如何该算法都是错误的,因为您需要检查所有数字之间的差异,而不仅仅是首先检查。问题的正确解决方案可能是在数组中找到最大和最小的数字,它们的差将是数组中的最大差。

标签: java arrays methods boolean logic


【解决方案1】:

您的程序不是问题的解决方案。 至少有两种解决方案,第一种是 O(n^2) 并且需要有两个 for 循环来比较它们之间的所有元素。 您应该使用的第二种解决方案是问题迫使您选择,因为它说您只能循环数组一次,它是在一个 for 循环中找到数组的最小值和最大值并控制它们的差异。如果它们的差异大于给定的数字,则返回 true,否则返回 false。

【讨论】:

    【解决方案2】:

    Math.abs(firstNum)-(Math.abs(a[i])

    必须

    Math.abs(firstNum - a[i])

    您应该得到差值的abs,而不是每个数字。

    但是,你正在做的是abs(3) - abs(4) = -1 小于 0。(其他类似的事情)

    [...]如果数组中的2个数字之间存在差异,则其差异大于数字变量值

    但你只是在比较第一个数字......

    如果您需要查找是否存在两个数字,使得它们之间的差异大于传递的整数,请找到最小值和最大值并找到它们之间的差异(感谢@NeplatnyUdaj 纠正我)

    【讨论】:

    • “你不能一次完成。”。是的,他能。他只需要找出最小数和最大数之间的差。
    • @NeplatnyUdaj 哎呀。你说的对。我认为这是一个二和的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2022-01-20
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多