如何在不使用条件的情况下创建返回1或0的方法?

时间:2017-08-01 13:08:47

标签: java c# logic logical-operators

我在面试中被问了一个问题,如果提供0则返回1,如果提供1则不返回0,不使用条件,如果,三元等

只是为了给你和想法下面的代码,如果没有:

[]

Java Fiddle

更新 虽然@ Usagi的答案似乎最适合我写的代码......但重新考虑我重新分析答案的问题...... @ Sergio的答案似乎是最简单和最合适的..

17 个答案:

答案 0 :(得分:33)

如果只给出0和1,那么这可能更简单:

return 1 - value;

答案 1 :(得分:26)

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;
    }
}

答案 2 :(得分:23)

我们可以在这里使用xor运算符。 Xor是“exclusive or”,当有两个或零时返回0,如果只有一个则返回1.它在整数的每一位都这样做。

因此,例如,二进制1001 ^ 1000 = 0001,因为第一位有两个1,所以0,接下来的两个没有1,所以为零,最后一位只有一个1,输出1。

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

答案 3 :(得分:14)

我的原始答案

MOBILE_USER_AGENT = "Mozilla/5.0 (Linux; U; en-gb; KFTHWI Build/JDQ39) AppleWebKit/535.19 (KHTML, like Gecko) Silk/3.16 Safari/535.19"
FB_AUTH = "https://www.facebook.com/v2.6/dialog/oauth?redirect_uri=fb464891386855067%3A%2F%2Fauthorize%2F&display=touch&state=%7B%22challenge%22%3A%22IUUkEUqIGud332lfu%252BMJhxL4Wlc%253D%22%2C%220_auth_logger_id%22%3A%2230F06532-A1B9-4B10-BB28-B29956C71AB1%22%2C%22com.facebook.sdk_client_state%22%3Atrue%2C%223_method%22%3A%22sfvc_auth%22%7D&scope=user_birthday%2Cuser_photos%2Cuser_education_history%2Cemail%2Cuser_relationship_details%2Cuser_friends%2Cuser_work_history%2Cuser_likes&response_type=token%2Csigned_request&default_audience=friends&return_scopes=true&auth_type=rerequest&client_id=464891386855067&ret=login&sdk=ios&logger_id=30F06532-A1B9-4B10-BB28-B29956C71AB1&ext=1470840777&hash=AeZqkIcf-NEW6vBd"

def get_access_token(email, password):
    s = robobrowser.RoboBrowser(user_agent=MOBILE_USER_AGENT, parser="lxml")
    s.open(FB_AUTH)
    ##submit login form##
    f = s.get_form()
    f["pass"] = password
    f["email"] = email
    s.submit_form(f)
    ##click the 'ok' button on the dialog informing you that you have already authenticated with the Tinder app##
    f = s.get_form()
    s.submit_form(f, submit=f.submit_fields['__CONFIRM__'])
    ##get access token from the html response##
    access_token = re.search(r"access_token=([\w\d]+)", s.response.content.decode()).groups()[0]
    #print  s.response.content.decode()
    return access_token

以及@The Photon

建议的修改后的内容
public int TestMethod(int value)
{
     return Convert.ToInt32(!Convert.ToBoolean(value));
}

另一种方法是基于public int TestMethod(int value) { return Convert.ToInt32(value == 0); } 中整数除法的行为,并避免使用异常处理。

C#

所有三种方法都会返回相同的结果:

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

答案 4 :(得分:6)

您可以像这样使用按位运算符:

value ^ 1

^是按位XOR运算符,“如果在一个操作数中设置但不在两个操作数中,则复制该位”。比特中1和0的表示如下:

1 = 0000 0001

0 = 0000 0000

所以,当值= 1时,你最终会这样做:

1 ^ 1 =(0000 0001)^(0000 0001)= 0000 0000 = 0因为它们共享相同的位而没有复制任何位。

现在,如果value = 0,你最终会这样做:

0 ^ 1 =(0000 0000)^(0000 0001)= 0000 0001 = 1,因为最后一位在一个操作数中是1而在另一个操作数中是0。

答案 5 :(得分:4)

假设您的语言具有等同于get the absolute value of this number的内容,则为:

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

会起作用。

答案 6 :(得分:4)

或者,一个try / catch函数除以0 /值。
- 函数无需使用任何数学库即可运行;
- 函数适用于所有整数值;

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

通过触发编译错误来完成值的选择:
零除以零通常会触发编译错误。然后返回1;
零划分任何不同于零的值返回0;

答案 7 :(得分: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; 

答案 8 :(得分:1)

请查看我的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等类的逻辑和算术运算。

说明:

  • 执行XOR运算符输入数字x和负输入数-1 * xC#描述的XOR运算符为(-x ^ x)
  • 如果x为非零数字,则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>

答案 9 :(得分:1)

Number(!value)

它将返回真实或伪造的值并将其转换回数字,您将从1得到0,从0得到1。

答案 10 :(得分:0)

字符串欺骗!

爪哇:

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。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

考虑输入只有[1, 0],也可以使方法将0返回到输入功率

在java中

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

相同的逻辑可以应用于任何其他语言

答案 13 :(得分:0)

如果不允许其他输入

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

答案 14 :(得分:0)

使用按位xor可能是计算效率最高的方法

return value ^ 1

答案 15 :(得分:0)

给定值的范围i是[0,1]:

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

这是毫无意义的......

答案 16 :(得分:0)

效率不高,但很有趣:

public int neg(int n){
    return (int) Math.pow(0, n);
}