我在面试中被问了一个问题,如果提供0则返回1,如果提供1则不返回0,不使用条件,如果,三元等
只是为了给你和想法下面的代码,如果没有:
[]
更新 虽然@ Usagi的答案似乎最适合我写的代码......但重新考虑我重新分析答案的问题...... @ Sergio的答案似乎是最简单和最合适的..
答案 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
建议的修改后的内容
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
除外)。
仅使用没有Math
,Convert
等类的逻辑和算术运算。
说明:
x
和负输入数-1 * x
。 C#
描述的XOR运算符为(-x ^ x)
x
为非零数字,则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>
答案 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);
}