it-swarm.com.ru

Как создать метод для возврата 1 или без использования условий?

В интервью мне был задан вопрос: вернуть 1, если предоставлено 0, и вернуть 0, если предоставлено 1, без использования условий, т.е.

Просто чтобы дать вам и идею ниже код без if:

public int testMethod(int value){
    if(value==0) return 1;
    if(value==1) return 0;
    return 0;
}

Java Fiddle

UPDATE: Хотя ответ @ Usagi может показаться наиболее подходящим по отношению к написанному мною коду ... но, переосмысливая вопрос, я повторно проанализировал ответы ... и ответ @ Sergio кажется самым простым и лучшим поместиться .. 

18
Rafay

Если вам даны только 0 и 1, то это может быть проще:

return 1 - value;

33
Sergio Muriel
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;
    }
}
26
Usagi Miyamoto

Мы можем использовать оператор xor здесь. Xor является "исключительным или" и возвращает 0, когда есть два или ноль 1, и возвращает 1, если точно один 1. Он делает это с каждым битом целого числа.

Так, например, двоичный файл 1001 ^ 1000 = 0001 в качестве первого бита имеет два 1, поэтому 0, следующие два не имеют 1, то есть ноль, а последний бит имеет только один 1, выводя 1.

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

Мой оригинальный ответ

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 
14
Martin Backasch

Вы можете использовать побитовый оператор так:

value ^ 1

^ - побитовый оператор XOR, который «копирует бит, если он установлен в одном операнде, но не в обоих». Представление 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 в одном из операндов, а 0 - в другом. 

6
Malphrush

Кроме того, функция try/catch, которая делит 0/значение.
- Функция работает без использования какой-либо математической библиотеки;
- Функция работает со ВСЕМИ целочисленными значениями;

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

Выбор значения осуществляется путем запуска ошибки компиляции:
Ноль, деленный на ноль, обычно вызывает ошибки компиляции. Затем возвращает 1;
Ноль разделил любое значение, отличное от нуля, возвращает 0;

4
Arthur Zennig

Предполагая, что ваш язык имеет что-то эквивалентное get the absolute value of this number, то что-то вроде:

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

должно сработать.

4
mjwills

Пожалуйста, просмотрите мое решение 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 и т.д.

Объяснение:

  • Выполните XOR оператор для номера ввода x и отрицательного номера ввода -1 * x. Описанный оператор XOR для C# - это (-x ^ x) 
  • Оператор XOR возвращает число со знаковым битом, если x не является нулевым числом (конечно, XOR с нулевыми числами возвращает 0)
  • Знаковый бит - это левый бит числа. Знаковый бит - это 32-й бит для числа int.
  • Выполните оператор вправо-смещение и поместите бит знака на первое место для числа int: (-x ^ x) >> 31
  • (-x ^ x) >> 31 возвращает -1 для любого ненулевого значения int (для нулевого числа возвращает 0)
  • Добавить 1 и вернуть результат

<iframe width="100%" height="475" src="https://dotnetfiddle.net/Widget/x4HCYj" frameborder="0"></iframe>

1
Alexander I.

Я думаю, что вопрос о подсчете количества бит-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; 
1
holi-java

Использование побитового xor, вероятно, является наиболее эффективным в вычислительном отношении способом сделать это.

return value ^ 1

0
CodingPill

учитывая, что входные данные являются только [1, 0], также возможно сделать метод, чтобы возвратить 0 в степень ввода

На яве

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

Та же логика может быть применена для любого другого языка

0
Hatik

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

0
aabeshou

Приведенный диапазон значения i равен [0, 1]:

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

Это довольно бессмысленно ...

0
Steve Fan

если нет других входов, разрешены 

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

Струнный обман!

Джава:

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, если совпадений не найдено.

0
FireballStarfish