如何在不使用条件的情况下创建返回 1 或 0 的方法?
Posted
技术标签:
【中文标题】如何在不使用条件的情况下创建返回 1 或 0 的方法?【英文标题】:How to create a method to return 1 or 0 without using conditions? 【发布时间】:2018-01-08 09:03:26 【问题描述】:我在面试中被问到一个问题,如果提供 0 则返回 1,如果提供 1 则返回 0,而不使用条件,即 if,三元等
只是为了给你和下面的代码没有 if 的想法:
public int testMethod(int value)
if(value==0) return 1;
if(value==1) return 0;
return 0;
Java Fiddle
更新: 虽然@Usagi 的答案可能看起来最适合我编写的代码.. 但重新考虑我重新分析答案的问题.. 和@Sergio 的答案似乎最简单和最适合..
【问题讨论】:
@HelderSepu 你读过这个问题吗? 输入既不是0也不是1怎么办? 为什么现在删除的return 1-value;
答案被否决了?没有说明要为其他输入返回什么,这是完全正确的,并且比其他答案简单得多。
这与语言非常不是无关,因为任何解决方案都在很大程度上取决于整数数据类型的实现方式。 (至少,在输入不是示例所暗示的 1 或 0 的情况下。)
如果您希望在其他输入上返回 0,您应该明确说明(事实上,即使 0 和 1 是唯一有效的输入值,您也应该澄清一下)。目前可以假设代码中的 return 语句只是为了让你的代码编译,或者它是为了故意处理其他输入。
【参考方案1】:
如果只给你 0 和 1,那么这可能会更简单:
return 1 - value;
【讨论】:
哇,很棒的解决方案。 最简单的东西就是最美的 好吧,我把头撞错了门……这是一个美丽的答案……【参考方案2】:public int testMethod(int value)
return 1 - (value % 2); // or 1 - (value & 1)
这可以用来在任何值和0之间切换,例如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;
【讨论】:
Doh,你打败了我! 哦不错..从来没有这样想过.. :)【参考方案3】:我们可以在这里使用 xor 运算符。 Xor 是“异或”,当有两个或零个 1 时返回 0,如果正好有一个 1,则返回 1。它对整数的每一位都执行此操作。
所以比如二进制1001 ^ 1000 = 0001,因为第一位有两个1,所以为0,后面两个没有1,所以为零,最后一位只有一个1,输出一个1。
public int testMethod(int value)
return value ^ 1;
【讨论】:
我认为这是更好的答案,因为在对布尔值进行操作时,XOR 在逻辑上等同于不等式运算符。 这与除了 0 和 1 以外的输入的原始代码给出的答案不同。【参考方案4】:我原来的答案
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);
所有三个方法都将返回相同的结果:
In | Out
-2 | 0
-1 | 0
0 | 1
1 | 0
2 | 0
【讨论】:
唯一的答案不忽略最后一个return 0;
备用:return Convert.ToInt32(value==0);
@ThePhoton value==0
可能会损害约束'不使用条件,即如果,三元等条件'
@Martin、if
和?:
语句是在控制流中产生分支的条件语句。 ==
只是一个产生结果的运算符 --- 它不能在控制流中产生任何分支,除非与 if
或 ?:
之类的条件一起使用(或短路 &&
或 ||
或者可能是我忘记的其他东西)。【参考方案5】:
你可以像这样使用位运算符:
value ^ 1
^ 是按位 XOR 运算符,它“如果在一个操作数中设置该位,但不能同时在两个操作数中设置,则复制该位”。 1和0的位表示如下:
1 = 0000 0001
0 = 0000 0000
所以当 value = 1 时,你最终会这样做:
1 ^ 1 = (0000 0001) ^ (0000 0001) = 0000 0000 = 0 因为它们共享相同的位,所以没有一个位被复制。
现在如果 value = 0 你最终会这样做:
0 ^ 1 = (0000 0000) ^ (0000 0001) = 0000 0001 = 1 因为其中一个操作数的最后一位为 1,而另一个操作数的最后一位为 0。
【讨论】:
考虑 0 或 1 以外的输入。 @ThePhoton:这不是操作给出的规范。【参考方案6】:假设您的语言具有与 get the absolute value of this number
等效的内容,则类似于:
public int testMethod(int value)
return Math.abs(value - 1);
会起作用的。
【讨论】:
【参考方案7】:或者,除以 0/值的 try/catch 函数。 - 函数无需使用任何数学库即可运行; - 函数适用于所有整数值;
public int MethodTest(int value)
try
return (0/value);
catch(Exception ex)
return 1;
值的选择是通过触发编译错误来完成的:零除以零通常会触发编译错误。然后返回 1;一个零除以任何不同于零的值返回 0;
【讨论】:
【参考方案8】:Math.floor(1 / (1 + Math.abs(x)))
【讨论】:
【参考方案9】:我认为问题是关于计算第 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;
【讨论】:
【参考方案10】:考虑到输入只有[1, 0]
,也可以制作方法来返回输入的0次方
在java中
public int test(int value)
return Math.pow(0,value);
同样的逻辑适用于任何其他语言
【讨论】:
【参考方案11】:如果没有其他输入是允许的
static int Test(int @value)
return (@value + 1) % 2;
【讨论】:
【参考方案12】:使用按位异或可能是计算效率最高的方法
return value ^ 1
【讨论】:
【参考方案13】:请查看我的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;
它适用于所有 int
值(int.MinValue
除外)。
只使用没有Math
、Convert
等类的逻辑和算术运算。
解释:
对输入数x
和负输入数 -1 * x
执行 XOR 运算符。所描述的C#
的异或运算符是(-x ^ x)
如果x
是非零数字,XOR 运算符返回带符号位的数字(当然,零数字的 XOR 返回 0)
符号位是数字的左位。符号位是int
数字的第 32 位。
执行right-shift 运算符并将符号位放在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>
【讨论】:
你好 Alexander,我肯定没有否决它..也许有人向它发送垃圾邮件。【参考方案14】:数字(!值)
它将返回真值或假值并将其转换回数字,您将从 1 中得到 0,从 0 中得到 1。
【讨论】:
方法返回 int 而非布尔值 (!value) 返回布尔值,您可以将其转换回 Number 函数在这里所做的数字【参考方案15】:字符串诡计!
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;
如果没有找到匹配项,这依赖于 indexOf/IndexOf 返回 -1。
【讨论】:
【参考方案16】:给定 i 的取值范围是 [0, 1]:
public int test(int i)
return !i;
这很没有意义......
【讨论】:
你能指定你使用的语言吗?这不会在C#
和Java
中编译。【参考方案17】:
效率不高,但很有趣:
public int neg(int n)
return (int) Math.pow(0, n);
【讨论】:
【参考方案18】:你正在寻找这样的东西
var status = $_POST['status'];
status=='1'?'0':'1';
【讨论】:
不使用条件,即 if、三元等。您的解决方案使用三元运算符以上是关于如何在不使用条件的情况下创建返回 1 或 0 的方法?的主要内容,如果未能解决你的问题,请参考以下文章
如果数字不是偶数,为啥这个函数会返回“None”?如何在不使用其他条件的情况下使其返回“False”?