2010-03-11 37 views
62

Với mã bên dưới, bạn sẽ tạo/triển khai SR.h sao cho nó tạo ra kết quả chính xác KHÔNG có bất kỳ dấu hoa thị nào trong giải pháp của bạn?Chủ đề phỏng vấn khó khăn cho C++

Tôi bị cuốn hút bởi câu hỏi này. Tôi muốn biết một số phương pháp khác nhau mà mọi người sử dụng cho vấn đề này.

#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]); 
} 

Output:

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

Second một:

#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". 
+11

Tại sao không nên này là một câu hỏi thực sự? Tui bỏ lỡ điều gì vậy? – sbi

+4

@sbi Câu hỏi phỏng vấn, đặc biệt là câu hỏi nhân tạo, thường không phải là "thực". Không phải là tôi đã bỏ phiếu hoặc đóng bình chọn cho chính bản thân mình. –

+0

Tôi cũng không chắc chắn về cuộc bỏ phiếu phủ định. Có lẽ mọi người cần phải nhanh chóng trong những ngày này. –

Trả lời

77

SR hoạt động như một trình phục hồi có thể thay đổi được. Khi nó đi ra khỏi phạm vi nó khôi phục lại một số giá trị mà nó đã bị bắt trước đó.

Hàm tạo sẽ thực hiện hai việc: nắm bắt tham chiếu và nắm bắt giá trị của tham chiếu đó. Trình hủy sẽ khôi phục giá trị ban đầu về tham chiếu đó.

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

private: 
    int& capture; 
    int value; 
}; 

Chỉnh sửa: Chỉ cần đoán, nhưng tôi cho rằng SR được cho là phù hợp với ScopeRestorer?

+9

Suy nghĩ của tôi là SR = SaveRestore. –

+1

@Mark: SaveRestore dường như có nhiều khả năng hơn, cảm ơn! – Bill

16

Tôi không có thời gian để viết mã nhưng, bạn cần phải sử dụng tài liệu tham khảo & int trong constructor. Và bạn sẽ cần phải khôi phục lại các giá trị ban đầu để tham chiếu trong destructor. Khi SR vượt quá phạm vi, nó cần khôi phục các giá trị ban đầu đã được truyền trong khi xây dựng.

+0

+1 Tuyệt vời và sắc nét! – bragboy

4

Đối với người đầu tiên:

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

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

Đối với đoạn mã thứ hai, nó phải là như nhau SR hoặc một số SR khác?

+0

Giải pháp này làm việc cho cả hai, vì vậy tôi giả định nó có nghĩa là để đáp ứng cả hai chức năng 'main'. – Bill

+0

có ... nó có nghĩa là cho cả hai – aherlambang

+3

Mã của bạn sẽ không biên dịch cho đến khi bạn đặt dấu hai chấm sau công khai –

3
#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); 
} 

Hoặc, nói cách khác, tôi nghĩ rằng khái niệm vĩ mô phạm vi phục chế là thực sự mát mẻ, nhưng tôi không thích cách các câu hỏi đã được worded :)

+0

haha, buồn cười! Điều này thực sự có thể là một câu trả lời ass thông minh cho vấn đề này. – Grim

+0

Tôi gần như bị cám dỗ để bắt đầu một tiền thưởng và đưa nó cho bạn. – v010dya

0

Một giải pháp cho # 2 là :

#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 

Tôi biết giải pháp này hơi xấu xí và chạy vòng lặp for 161700 lần để thêm số. Điều này sẽ làm việc cho bất kỳ số nào, nhưng tôi không chắc chắn tại sao 161700 được chọn. Nó cũng không ảnh hưởng đến độc đáo.

+0

"Câu trả lời" này sẽ bị xóa là hoàn toàn gây hiểu lầm. Cùng một lớp SRT hoạt động ở đây. hiệu quả là nếu bạn có int k = i, trong khi (k--) sum + = k; Cùng áp dụng cho người dưới đây để được "đặc biệt cho # 2". – ZXX

2

Giải pháp cho câu hỏi đầu tiên

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

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

Tôi không biết ai đã downvoted, nhưng tôi đã khôi phục lại ballance, vì đối với tôi nó thực sự dễ dàng hơn để đọc code trong trường hợp này. Bạn biết những gì bạn đang tiết kiệm (một địa chỉ cho một con trỏ). Giá trị tham chiếu rất tuyệt, nhưng điều này không làm cho câu trả lời này sai. – v010dya

+0

cảm ơn @Volodya có tôi đồng ý người dùng nên sử dụng tài liệu tham khảo, nơi họ có thể được sử dụng thay vì con trỏ. Tôi đã sử dụng con trỏ giống như vậy, không có lý do cụ thể nào, trọng tâm của tôi là giải quyết vấn đề. :-) – luck

-1

câu trả lời rất rất xấu xí cho câu hỏi thứ hai ==>

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; 
} 
}; 
+1

Um .. bạn đang sử dụng dấu hoa thị trong mã của mình. – NathanOliver

Các vấn đề liên quan