【问题标题】:Boolean with loops to check an array带有循环的布尔值以检查数组
【发布时间】:2013-09-23 18:28:24
【问题描述】:

为循环编写 Java 代码,如果调用的给定整数数组的元素按非递减顺序设置布尔变量 isOrdered 为 true,否则将 isOrdered 设置为 false。

int i[] = { 1, 2, 3, 4, 5 };
int b = 0;
boolean isOrdered = false;
while (b < i.length) {
    if (i[0] <= i[b]) {
        isOrdered = true;
    }
    b++;
}
out.println(isOrdered);

我这样做对吗?

【问题讨论】:

  • if (i[0] &lt;= i[b]) 这行在您尝试做的事情上存在根本缺陷。
  • 正如isOrdered = true 基于一次比较。就是说“如果排序不正确,这对第0位和第b位的元素排序正确”
  • 这是一个很好的例子,说明问题写得很好。

标签: java arrays boolean


【解决方案1】:

没有;您只检查数组的第一个元素是否小于或等于至少一个元素 - 包括第一个元素本身,它将始终等于自身,将 isOrdered 设置为 true 无论如何其余元素是。

提示 #1:您应该将除第一个元素之外的每个元素与紧接在它之前的元素进行比较。

提示#2:你应该乐观并假设数组是有序的,然后寻找一个反例。一旦您发现一对违反顺序的元素,将isOrdered 设置为 false 并跳出循环。

【讨论】:

  • 提示 #2 的原因不仅仅是优化。在问题的版本中,如果任何比较成功,则结果为真,但我认为您只希望在所有比较成功时才为真。
  • 我的意思是“乐观”的意思是“首先假设一个积极的结果,然后尝试找到一个反例”;它与优化无关。
【解决方案2】:

对数组的大小做一个for循环来检查下一项是否小于当前项:

   int arr[] = { 1, 2, 3, 4, 5 };
    int b = 0;
    boolean isOrdered = true;
    for (int i = 0; i< arr.length - 1 ; i ++) {
        if (arr[i] > arr[i+1])
        {
            isOrdered = false;
            break;
        }
        b++;
    }
    out.println(isOrdered);

【讨论】:

  • 你不是说if (arr[i] &gt; arr[i+1])
  • @Marcelo 你是对的。在减少之前没有看到“不”
【解决方案3】:

让我们看看有什么问题。

if (i[0] <= i[b])

这是您的代码困扰我的主要领域。您如何检查您的下一个值是否低于/高于i[b] 您只是将索引零处的值与索引 b 进行比较!

基本上你的代码在循环中看起来像这样。

/w int i[] = { 1, 2, 3, 4, 5 };

i[0] i[b]
1     1
1     2
1     3
...

你看对了吗?你真正需要的是检查b.之后的下一个值

所以代码看起来像i[b] &gt; i[b+1]

老实说,您可能会根据如何将isOrdered 的顺序初始化为真假来实现这一点。我会首先将其初始化为真。然后,如果您发现问题中有 false. 的谬误,那么我们的想法是打破您正在执行的任何过程。请查看我的示例以获取更多参考

迭代

boolean isOrdered = true;

while(isOrdered && array.length - 1 > b){
     if(array[b] > array[b+1]) isOrdered = false;
     b++;
}

递归

boolean isOrdered(int[] array, index){
    if(index == array.length - 1) return true;
    if(array[index] > array[index + 1]) return false;
    return isOrdered(array, index + 1);
} 

递归的方法是waaaaaaaaaay更酷。

【讨论】:

  • 这真的不是递归解决方案,而是替代迭代解决方案。不过我喜欢。
  • @AndyPerfect 刚刚添加了一个递归解决方案,OP 要求一个迭代解决方案,所以我先做了一个 :)
  • isOrdered == true 可以只是isOrdered
  • @Marcelo 我总是跟上== 我总是忘记。好渔获更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2017-06-04
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2017-09-11
相关资源
最近更新 更多