1

問題は、「int の配列が与えられた場合、int を 2 つのグループに分割して、一方のグループの合計が 10 の倍数になり、もう一方のグループの合計が奇数になるようにすることは可能ですか?任意の引数を取る再帰ヘルパー メソッドを作成し、splitOdd10() から再帰ヘルパーへの最初の呼び出しを行います (ループは必要ありません。)"

以下に正しい解決策がありますが、すべての戻り値は正しい値とは反対です。それを修正するハックな方法は、最後にブール値を切り替えることでしたが、概念的にどのような間違いを犯しているのか知りたいです。

public  boolean splitOdd10(int[] nums) { 
    if (nums.length==0) return false;

    //Should not have the ! operator
    return (!splitOdd10(nums,0,1));

}
public  Boolean splitOdd10(int[] nums, int lowerBound,int upperBound) {
    int split10Sum=getSum(nums,lowerBound,upperBound);
    int splitOddSum=getSum(nums)-split10Sum;
    if (split10Sum % 10 == 0 && splitOddSum % 2 == 0)   return true;

    if (upperBound < nums.length)   {
        if (splitOdd10(nums,lowerBound,upperBound+1)) return true;
        if (splitOdd10(nums,lowerBound+1,upperBound+1)) return true;
    }
    if (lowerBound < upperBound) 
        if (splitOdd10(nums,lowerBound+1,upperBound)) return true;
    return false;
}


public  int getSum(int[] nums)    {
return getSum(nums,0,nums.length);
}
public  int getSum(int[] nums, int lowerBound, int upperBound) {
    if (lowerBound == upperBound)   return 0;
return nums[lowerBound]+getSum(nums,lowerBound+1,upperBound);
}
4

1 に答える 1

3

あなたの答えで注意すべき2つのこと:

  1. splitOdd10(new int[] {10, 1, 10, })true ではなく、false を返します。
  2. メソッドsplitOdd10(int[] nums, int lowerBound,int upperBound)は、現在のグループ化に10Sum10 でrest割り切れる数と 2 で割り切れる数がある場合、つまり奇数ではなく偶数の場合に true を返します。

具体的には。2 番目のポイント:

if (split10Sum % 10 == 0 && splitOddSum % 2 == 0)   return true;

する必要があります

if (split10Sum % 10 == 0 && splitOddSum % 2 == 1)   return true;

最初のポイントは、何を解決しようとしているのかによっては問題ない場合があります。つまり、配列を 2 つに「分割」する必要がある場合、それは機能しますが、誤検知が多すぎる可能性があります。具体的には、次の配列に対する答えがどうあるべきかを考える必要があります。

[10, 10, 1]
[1, 10, 10]
[1, 10, 2]
[1, 2, 10]
[10, 1, 10]
[10, 1, 2]
于 2013-10-14T19:39:06.820 に答える