如何在不使用条件的情况下创建返回 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 除外)。

只使用没有MathConvert等类的逻辑和算术运算。

解释:

对输入数 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”?

在函数中,如何在不使用 ref 游标的情况下返回多个值?

如何在不返回值的情况下显示消息

如何在不使用 Pandas 的情况下创建等效于 numpy.nan 的日期时间对象?

如何在不使用列表的情况下转换字符串中的数字?

如何在不更改标准输入缓冲的情况下 fork-then-execve?