web-dev-qa-db-ja.com

条件を使用せずに1または0を返すメソッドを作成する方法は?

インタビューで、0が提供された場合は1を返し、1を提供された場合は条件を使用せずに0を返すように質問されました。

Ifを使用せずに、以下のコードとアイデアを提供するだけです。

public int testMethod(int value){
    if(value==0) return 1;
    if(value==1) return 0;
    return 0;
}

Java Fiddle

UPDATE:@Usagiの回答は、私が書いたコードに関しては最適と思われるかもしれませんが、質問を再考し、回答を再分析しました..と@Sergioの答えは、最もシンプルで最適なようです..

18
Rafay

0と1のみが指定されている場合、これはより簡単になります。

return 1 - value;

34
Sergio Muriel
public int testMethod(int value) {
  return 1 - (value % 2); // or 1 - (value & 1)
}

これにより、任意の値と0、EG 3を切り替えることができます。

public int testMethod3(int value) {
  return 3 - (value % 4);
}

そして、return 0質問のサンプルの最後:

private static final int[] VALUES = { 1, 0 };

public int testMethod(int value) {
    try {
        return VALUES[value];
    } catch (ArrayIndexOutOfBoundsException ex) {
        return 0;
    }
}
26
Usagi Miyamoto

ここでxor演算子を使用できます。 Xorは「排他的OR」であり、1が2つまたは0の場合は0を返し、1が1つだけの場合は1を返します。これは整数のすべてのビットでこれを行います。

したがって、たとえば、最初のビットには2つの1があるため、バイナリ1001 ^ 1000 = 0001であるため、0、次の2つには1がないため、最後のビットは1のみで、1を出力します。

public int testMethod(int value){
    return value ^ 1;
}
23
Louie Mayo

私の元の答え

public int TestMethod(int value)
{
     return Convert.ToInt32(!Convert.ToBoolean(value));
}

@ The Photon によって提案された変更されたもの

public int TestMethod(int value)
{
     return Convert.ToInt32(value == 0);
}

別のアプローチは、C#の整数除算の動作に基づいており、例外処理の使用を回避します。

public int TestMethod(int value)
{
    return 1 / ((10 * value) + 1);
}

3つのメソッドはすべて同じ結果を返します。

In | Out
-2 | 0 
-1 | 0
 0 | 1
 1 | 0
 2 | 0 
13
Martin Backasch

次のようなビットごとの演算子を使用できます。

value ^ 1

^はビット単位のXOR演算子であり、「両方のオペランドではなく1つのオペランドにビットが設定されている場合、ビットをコピーします。」ビットの1および0の表現は次のとおりです。

1 = 0000 0001

0 = 0000 0000

したがって、値= 1の場合、次のようになります。

1 ^ 1 =(0000 0001)^(0000 0001)= 0000 0000 = 0は、同じビットを共有するため、どのビットもコピーされないためです。

値が0の場合、次のようになります。

0 ^ 1 =(0000 0000)^(0000 0001)= 0000 0001 = 1最後のビットはオペランドの1つでは1であるが、もう1つでは0であるため。

6
Malphrush

または、/値で除算のtry/catch関数
-関数は数学ライブラリを使用せずに動作します;
-関数はすべての整数値で動作します;

public int MethodTest(int value)
{
     try
     {
         return (0/value);
     } 
     catch(Exception ex)
     {
         return 1;
     }
}

値の選択は、コンパイルエラーをトリガーすることで行われます。
通常、ゼロをゼロで除算すると、コンパイルエラーが発生します。次に1を返します;
ゼロと異なる値をゼロで除算すると、0が返されます;

4
Arthur Zennig

あなたの言語がget the absolute value of this numberに相当するものを持っていると仮定すると、次のようになります:

public int testMethod(int value) {
  return Math.abs(value - 1);
}

動作します。

4
mjwills

質問はビット1カウントの計算に関するものだと思います。

public int testMethod(int value){
   //             v---  count = value == 0 ? 32 : [0,32)
   return Integer.bitCount(~value) / 32;
}

したがって、出力は次のようになります。

//      v--- return 1
assert  testMethod(0) == 1; 

//      v--- return 0
assert  testMethod(nonZero) == 0; 
1
holi-java

C#ソリューションを確認してください( 。NET Fiddle ):

private static int Calculate(int x)
{
    return ((-x ^ x) >> 31) + 1;
}

例:

Input: 0;           Output: 1;
Input: 1;           Output: 0;
Input: 64;          Output: 0;
Input: 65;          Output: 0;
Input: -100;        Output: 0;
Input: -101;        Output: 0;
Input: 102;         Output: 0;
Input: 888887;      Output: 0;
Input: 2147483647;  Output: 0;
Input: -2147483648; Output: 1;

allint値(int.MinValueを除く)に対して機能します。

MathConvertなどのクラスのない論理演算および算術演算のみが使用されました。

説明:

  • [〜#〜] xor [〜#〜] 入力番号xおよび負の入力番号-1 * xに対して演算子を実行します。説明XOR C#の演算子は(-x ^ x)です
  • xがゼロ以外の数値の場合、XOR演算子は符号ビット付きの数値を返します(もちろんXORゼロの数値は0を返します)
  • 符号ビットは、数値の左ビットです。符号ビットは、int番号の32番目のビットです。
  • 右シフト 演算子を実行し、int番号の最初の場所に符号ビットを配置します:(-x ^ x) >> 31
  • (-x ^ x) >> 31は、ゼロ以外のint値に対して-1を返します(ゼロの場合、0を返します)
  • 1を追加して結果を返す
<iframe width="100%" height="475" src="https://dotnetfiddle.net/Widget/x4HCYj" frameborder="0"></iframe>
0
Alexander I.

ビット単位のxorを使用するのが、おそらく最も計算上効率的な方法です

return value ^ 1

0
CodingPill

入力は[1, 0] 0を入力のべき乗に戻すメソッドを作成することもできます。

Javaで

public int test(int value){
    return Math.pow(0,value);
}

同じロジックを他の言語にも適用できます

0
Hatik

Math.floor(1 /(1 + Math.abs(x)))

0
anonymous

値iの範囲が[0、1]の場合:

public int test(int i) {
    return !i;
}

これはかなり無意味です...

0
Steve Fan

他に入力が許可されていない場合

    static int Test(int @value)
    {
        return (@value + 1) % 2;
    }
0
Naphthalene

ストリングトリック!

Java:

public int testMethod(int value) {
    return String.valueOf(value).substring(0, 1).indexOf('0') + 1;
}

C#:

public int testMethod(int value) {
    return value.ToString().Substring(0, 1).IndexOf('0') + 1;
}

これは、一致が見つからなかった場合に-1を返すindexOf/IndexOfに依存しています。

0