Трюки интервью для С++
С учетом приведенного ниже кода, как бы вы могли создать/реализовать 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".
Ответы
Ответ 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;
}
};