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

Трюки интервью для С++

С учетом приведенного ниже кода, как бы вы могли создать/реализовать SR.h, чтобы он выдавал правильный вывод без каких-либо звездочек в вашем решении?

Меня обманул этот вопрос. Я хотел бы узнать некоторые из разных подходов, которые люди используют для этой проблемы.

#include <cstdio>
#include "SR.h"

int main()
{
    int j = 5;
    int a[] = {10, 15};
    {
        SR x(j), y(a[0]), z(a[1]);

        j = a[0];
        a[0] = a[1];
        a[1] = j;

        printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
    }

    printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
}

Вывод:

j = 10, a = {15, 10}
j = 5, a = {10, 15}

Второй:

#include <cstdio>
#include "SR.h"
int main()
{
    int sum = 0;
    for (int i = 1; i < 100; i++) {
        SR ii(i);
        while (i--)
            sum += i;
    }
    printf("sum = %d\n", sum);
}

//The output is "sum = 161700".
4b9b3361

Ответ 1

SR действует как захваченный переменный-реставратор. Когда он выходит из области видимости, он восстанавливает некоторое значение, которое оно ранее захватило.

Конструктор будет делать две вещи: захватить ссылку и зафиксировать значение этой ссылки. Деструктор вернет исходное значение этой ссылке.

class SR
{
public:
  SR(int& var) : capture(var), value(var) {}
  ~SR() { capture = value; }

private:
  int& capture;
  int value;
};

Изменить: просто догадаться, но я полагаю, что SR должен стоять за ScopeRestorer?

Ответ 2

У меня нет времени писать код, но вам нужно использовать reference & int в конструкторе. И вам нужно будет восстановить исходные значения в ссылках в деструкторе. Когда SR выходит из сферы видимости, ему необходимо восстановить исходные значения, которые были переданы во время построения.

Ответ 3

Для первого:

class SR
{
    int &ref;
    int orig;
public:
    SR(int& r)
    :ref(r), orig(r)
    {
    }

    ~SR()
    {
        ref = orig;
    } 
};

Для второго фрагмента, должен ли он быть одним и тем же SR или некоторым другим SR?

Ответ 4

#define printf myprintf
void myprintf(int, int, int, int) {
    printf("j = 10, a = {15, 10}\nj = 5, a = {10, 15}");
    exit(0);
}
void myprintf(int, int) {
    printf("sum = 161700");
    exit(0);
}

Или, другими словами, я думаю, что концепция макроса реставратора области действительно крутая, но мне не нравится, как был сформулирован вопрос:)

Ответ 5

Решение первого вопроса

class SR
{
public:
int initial;
int* var;
SR(int &a) : var(&a),initial(a){}

~SR()
{
    *var = initial;
}
};

Ответ 6

Решение для # 2:

#define _SR_H_

int count = 0;

class SR {
private:
    int& ref;
public:
    SR(int& val) : ref(val) {
        count++;
    }
    ~SR() {
        if (count == (161700 + 1)) {
            ref = 100;
        } else {
            ref = 1;
        }
    }
};

#endif

Я знаю, что это решение немного уродливое, и он запускает цикл for 161700 раз, чтобы добавить числа. Это будет работать для любого числа, но я не знаю, почему было выбрано 161700. Это также не факторизует.

Ответ 7

очень-очень уродливый ответ на второй вопрос == >

class SR
{
public:
int* var;
int initial;
SR(int &a) : var(&a)
{
    initial = *var;
    if (1 == *var)
    {
        *var = 569;
    }
    else if (2 == *var)
    {
        *var = 5;
    }
    else if ((99 == *var) || (98 == *var) || (97 == *var ))
    {
        *var = 0;
    }
    else
    {
        *var = 2;
    }
}

~SR()
{
        *var = initial;
}
};