インタビューで、0が提供された場合は1を返し、1を提供された場合は条件を使用せずに0を返すように質問されました。
Ifを使用せずに、以下のコードとアイデアを提供するだけです。
public int testMethod(int value){
if(value==0) return 1;
if(value==1) return 0;
return 0;
}
UPDATE:@Usagiの回答は、私が書いたコードに関しては最適と思われるかもしれませんが、質問を再考し、回答を再分析しました..と@Sergioの答えは、最もシンプルで最適なようです..
0と1のみが指定されている場合、これはより簡単になります。
return 1 - value;
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;
}
}
ここで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;
}
私の元の答え
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
次のようなビットごとの演算子を使用できます。
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であるため。
または、/値で除算のtry/catch関数
-関数は数学ライブラリを使用せずに動作します;
-関数はすべての整数値で動作します;
public int MethodTest(int value)
{
try
{
return (0/value);
}
catch(Exception ex)
{
return 1;
}
}
値の選択は、コンパイルエラーをトリガーすることで行われます。
通常、ゼロをゼロで除算すると、コンパイルエラーが発生します。次に1を返します;
ゼロと異なる値をゼロで除算すると、0が返されます;
あなたの言語がget the absolute value of this number
に相当するものを持っていると仮定すると、次のようになります:
public int testMethod(int value) {
return Math.abs(value - 1);
}
動作します。
質問はビット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;
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
を除く)に対して機能します。
Math
、Convert
などのクラスのない論理演算および算術演算のみが使用されました。
説明:
x
および負の入力番号-1 * x
に対して演算子を実行します。説明XOR C#
の演算子は(-x ^ x)
ですx
がゼロ以外の数値の場合、XOR演算子は符号ビット付きの数値を返します(もちろんXORゼロの数値は0を返します)int
番号の32番目のビットです。int
番号の最初の場所に符号ビットを配置します:(-x ^ x) >> 31
(-x ^ x) >> 31
は、ゼロ以外のint
値に対して-1を返します(ゼロの場合、0を返します)<iframe width="100%" height="475" src="https://dotnetfiddle.net/Widget/x4HCYj" frameborder="0"></iframe>
ビット単位のxorを使用するのが、おそらく最も計算上効率的な方法です
return value ^ 1
入力は[1, 0]
0を入力のべき乗に戻すメソッドを作成することもできます。
Javaで
public int test(int value){
return Math.pow(0,value);
}
同じロジックを他の言語にも適用できます
Math.floor(1 /(1 + Math.abs(x)))
値iの範囲が[0、1]の場合:
public int test(int i) {
return !i;
}
これはかなり無意味です...
他に入力が許可されていない場合
static int Test(int @value)
{
return (@value + 1) % 2;
}
ストリングトリック!
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に依存しています。