0
import java.util.*;

public class FirstOddOccurrence {
    public static void main(String[] args) {
        int[] x = {2, 4, 6, 7, 4, 3, 2, 7, 6, 7, 7};
        int i;

        display(x);

        System.out.printf("# Occurrences of first odd = %3d\n", firstOddCount(x));
    }

    private static void display(int[] x) {
        int i;

        System.out.print("Array: ");
        for (i = 0; i < x.length; i++) {
            if (i < x.length - 1)
                System.out.printf("%3d, ", x[i]);
            else
                System.out.printf("%3d\n", x[i]);
        }
    }

    public static int odd(int[] x) {
        int i;
        int y;
        for (i = 0; i < x.length; i++) {
            y = x[i] % 2;
            if (y == 1) {
                return x[i];
            } else {
                return 0;
            }
        }
        return x[i];
    }

    public static int firstOddCount(int x[]) {
        int i;
        int c = 0;
        for (i = 0; i < x.length; i++) {
            if (x[i] == odd(x))
                c++;

        }
        return c;
    }
}

我试图在已提供的数组中找到第一次出现的奇数。我的程序有什么问题?我似乎无法让程序计算第一次出现的奇数。

4

4 回答 4

2

你的代码在这里:

if (y == 1) {
    return x[i];
} else {
    return 0;
}

不起作用 - 如果测试的数字是偶数,您立即返回0. 相反,您想跳过这些偶数并等到奇数出现。最后,如果你没有找到任何奇数,你就返回0。以下是 的更正版本odd()

int i;
int y;
for (i = 0; i < x.length; i++) {
    y = x[i] % 2;
    if (y == 1) {
        return x[i];
    }
}
return 0;
于 2013-01-18T04:23:40.333 回答
1

Andr 的解决方案解决了您的问题;如果 x[0] 是偶数,odd(x) 将返回 0,如果是奇数,则返回 x[0]。

你也可以像这样改进 firstOddCount:odd(x) 总是返回相同的值,所以只计算一次。

public static int firstOddCount(int x[]) {
   int firstOdd = odd(x);
   int c=0;
   for(int i=0; i < x.length; i++) {
       if (x[i]==firstOdd)
            c++;
   }
   return c;

}

于 2013-01-18T04:28:44.673 回答
0

您的特殊问题是,0如果您找到偶数,您会返回。这意味着该列表{2, 4, 6, 8, 1}将给你0,而不是1,作为第一个奇数。

应该做的是忽略前导偶数并继续处理列表。

但是,按照您组织程序的方式,您要处理列表的第一个全偶数部分两次,一次是odd() 为了找到第一个奇数,然后再一次是firstOddCount()为了计算该数有多少 - 这完全是不必要。

一旦找到第一个奇数,我认为您可以合理地确定该数字(或任何其他奇数)在您已经搜索过的空间中不存在。否则它将是第一个奇数。因此,返回并再次查看列表的初始部分是没有意义的。

您可以轻松地处理一次列表的一种方法如下:

public static int firstOddCount (int numbers[]) {
    // Find first odd number or end of list.

    int idx = 0, len = numbers.length;
    while ((idx < len) && ((numbers[idx] % 2) == 0)
        idx++;

    // If at end of list, everything is even => count(first(odd)) is 0.

    if (idx == len)
        return 0;

    // Otherwise, start counting from current position.

    int count = 1, oddnum = numbers[idx];
    while (++idx < len)
        if (numbers[idx] == oddnum)
            count++;

    return count;
}
于 2014-03-14T05:52:25.987 回答
-1

如果您试图从组中获取一个元素,您应该在您的条件第一次匹配时使用“break”,否则它将给出所有...

于 2013-01-18T04:24:48.293 回答