2

整数の配列が交互になっているかどうかを知りたいです。JAVAで。

例えば:

a[]={1,-1,1,-1,1,-1}  --> true
a[]={-1,1,-1,1,-1}    --> true
a[]={1,-4,1-6,1}      --> true
a[]={1,1,1,14,5,3,2}  --> false

フラグを使用するコードを書き始めました。たとえば、current_is_positive=0との場合else = 1、しかし私はどこにも行きません。この効果を達成するための良い方法は何ですか?

4

8 に答える 8

5

正の数、負の数、正の数など、符号を交互にすることを意味すると思いますか?次の戦略を使用できます。

最初の要素をスキップします。

他のすべての要素について、その符号を前の要素の符号と比較します。

  • それらが異なる場合、シーケンスは今まで交互になっています-続行する必要があります。
  • それらが同じ符号である場合、シーケンスは交互ではありません。この時点で処理を停止できます。

これは宿題のように聞こえるので、Javaで適切なコードを書くのはあなたに任せます。

于 2012-10-24T17:57:55.990 に答える
1

ここに私の解決策:

これは、要素n+1が要素nの逆であることを確認します。

    public static void main(String[] args) {
        int[] ints = {1, -1, 2, -1};
        System.out.println(new Example().isArrayAlternating(ints));
    }

    public boolean isArrayAlternating(int[] ints) {
        if (ints == null || ints.length % 2 != 0) {
            return false;
        }
        for (int i = 0; i < ints.length - 1; i++) {
            if (ints[i] != ints[i + 1]*(-1)) {
                return false;
            }
        }
        return true;
    }

値に注意を払わずに、正の数、負の数を... n回だけチェックしたい場合:

public static void main(String[] args) {
    int[] ints = {1, -1, 2, -1};
    System.out.println(new Example().isArrayAlternating(ints));
}

public boolean isArrayAlternating(int[] ints) {
    if (ints == null || ints.length % 2 != 0) {
        return false;
    }
    for (int i = 0; i < ints.length - 1; i++) {
        if (ints[i] >= 0 && ints[i + 1] >= 0 || ints[i] <= 0 && ints[i + 1] <= 0) {
            return false;
        }
    }
    return true;
}
于 2012-10-24T18:04:56.183 に答える
0
private enum SIGN {
    POSITIVE, NEGATIVE
};

public static boolean isAlternating(int... ints) {
    SIGN last = null;
    for (int i : ints) {
        if (i >= 0) {
            if (last == null) {
                last = SIGN.POSITIVE;
            } else {
                if (last == SIGN.POSITIVE) {
                    return false;
                } else {
                    last = SIGN.POSITIVE;
                }
            }
        } else {
            if (last == null) {
                last = SIGN.NEGATIVE;
            } else {
                if (last == SIGN.NEGATIVE) {
                    return false;
                } else {
                    last = SIGN.NEGATIVE;
                }
            }
        }
    }
    return true;
}
于 2012-10-24T18:03:55.607 に答える
0

すべてのアイテムが2ステップ前のアイテムと等しいかどうかを簡単に確認できます。使用している言語はわかりませんが、たとえばC#を使用すると、次のように実行できます。

bool alternating = a.Skip(2).Where((n, i) => a[i] == n).Count() == a.Length - 2;

編集:

では、値ではなく、値の符号が交互になっているかどうかを確認したいですか?

次に、前の項目に対してサインを確認します。

bool alternating = a.Skip(1).Where((n,i) => Math.Sign(n) == -Math.Sign(a[i])).Count() == a.Length-1;
于 2012-10-24T17:46:28.790 に答える
0
boolean prevPositive = arr[0] > 0, error = false;
for (int i = 1; i < arr.length; ++i) {
    boolean current = arr[i] > 0;
    if (current != prevPositive) {
        current = prevPositive;
    } else {
        error = true;
        break;
    }
}
if (error)
   System.out.println("No");
else
   System.out.println("Yes");
于 2012-10-24T17:58:52.617 に答える
0
  • 最初のインデックスから可能な最大値まで2ステップでループを実行して、同じ符号をチェックします。
  • 次に、2番目のインデックスから可能な最大値まで2ステップでループし、反対の符号をチェックしますが、すべて同じです。
  • したがって、インデックスからループします- 0, 2, 4, 6, ...
  • 次に、インデックスからループします-1, 3, 5, 7, ...

  • 次に、両方のループのすべての数値とその反復の最初の数値の乗算が正である必要があることを確認します。

    int a[]={1,-1,1,-1,1,-1};
    
    boolean alternating = true;
    
    for (int i = 0; i < a.length; i = i + 2) {
        if (a[i] * a[0] > 0) {
        } else {
            alternating = false;
        }
    }
    for (int i = 1; i < a.length; i = i + 2) {
        if (a[i] * a[1] > 0) {
        } else {
            alternating = false;
        }
    }
    
    if (alternating) {
        System.out.println("Array is alternating");
    } else 
        System.out.println("Array is not alternating");
    }
    
于 2012-10-24T17:59:35.327 に答える
0

インデックス1から最後まで配列を実行します。

各インデックスで、を評価し(a[i] > 0) == (a[i-1] > 0)ます。これが当てはまる場合、アレイは交互になっていません。

あなたがそれが交互ではないと結論せずに最後までそれを作るならば、それは交互です:)

于 2012-10-24T18:05:17.767 に答える
-2
For i = 2 to n

   check whether A[i-1] && A[i] are with diff sign..
   in C++; return  ((A[i-1] ^  A[i]) < 0).  

ここで同じ説明:http ://www.youtube.com/watch?v = Z59REm2YKX0

編集

整数が負の場合、上位ビットは1です。それ以外の場合は0です。2つの整数の符号が異なるかどうかは、XORを使用して確認できます。符号が異なる場合、結果の上位ビットは1になります。それらが同じである場合、上位ビットは0になります。したがって、

XOR B <0は、「AとBの符号が異なる」と同等です。

ピーター・ルーダーマン

于 2012-10-24T17:54:16.000 に答える