Подтвердить что ты не робот

Возвращая другой аргумент из двух возможных аргументов без использования условий

Например, если у меня есть функция, которая гарантированно получит 5 или 7 в качестве аргумента, я хочу, чтобы функция возвращала 5, если они были получены 7 и 7, если они получены 5 без каких-либо условий.

Меня попросили это в интервью и были довольно тупо, спасибо.

4b9b3361

Ответ 1

Простая арифметика:

return 7 - input + 5;

(который можно упростить как return 12 - input;)

Скажем, что вход равен 7:

return 7 - 7 + 5 → return 5

Или, если вход 5:

return 7 - 5 + 5 → return 7

Ответ 2

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

  • дополнение: f(x)=7+5-x
  • xor: f(x)=7^5^x
  • умножение: f(x)=7*5/x

Ответ 3

public int f(int x) {
    return x ^ 2;
}

В двоичном формате:

7 = 111
5 = 101
2 = 010

XOR (^ в java) переворачивает 2-х бит, если он выключен и выключен, если он включен.

Ответ 4

Как насчет:

public int q(int in)
{
    static final int[] ret = {0, 0, 0, 0, 0, 7, 0, 5};
    return ret[in];
}

Ответ 5

Если бы я был собеседованием, и вы решили его только для ввода цифр, мой следующий вопрос был бы следующим: "Как бы вы решили эту проблему для нечислового ввода?" потому что я бы не искал математической хитрости. Вместо этого, как насчет этого?

List<String> options = new ArrayList<>(Arrays.asList("bob", "fred"));
options.remove("bob");
System.out.println(options.get(0));

Это, очевидно, легко адаптируется к любому типу, включая Object, пока равенство объектов работает правильно и в качестве бонуса оно может быть выражено гораздо более кратко на других языках, таких как Groovy:

println((["bob", "fred"] - "bob").first())

Вывод, в любом случае, явно "fred". Если бы я был одним из собеседований, это тот ответ, который я бы искал.

Ответ 6

public int xyz(int x) {
    return 35 / x;
}

Ответ 7

Как работает xor? [для случая f (x) = 7 ^ 5 ^ x]

XOR (^) является исключительным OR и работает таким образом

a|b|a^b
-------
0|0| 0
0|1| 1
1|0| 1
1|1| 0

Итак, XOR (^) можно использовать для изменения битов некоторого числа. Например, если мы хотим изменить последние два бита любого числа (например, от xxxx10 до xxxx01), мы можем сделать это с помощью numbrer ^ 3, так как 3 является двоичным 00011.

Вот несколько фактов о XOR

  • XOR симметричен → a^b= b^a
  • XOR ассоциативен → (a^b)^c= a^(b^c)
  • a^a= 0 (единицы в a будут заменены нулями, а нули не будут изменены)

    пример для a = 157 (двоичный код 010011101)

      010011101
    ^ 010011101
    -----------
      000000000
    
  • 0^a= a (единицы в a могут изменять только нули, чтобы они меняли их на единицы)

      000000000
    ^ 010011101
    -----------
      010011101
    

поэтому используя факты (1) и (2) 7^5^x == x^7^5 == x^5^7

Давайте попробуем проверить, как x^7^5 будет работать для x=7.

(x^7)^5 = (7^7)^5 = 0^5 = 5

И то же самое происходит для x=5

(x^5)^7 = (5^5)^7 = 0^7 = 7