2011-12-26 39 views
10

Có possiblty để trao đổi ba số trong một tuyên bố đơnSwap Ba Số Trong Tuyên bố Độc

Ví dụ:

  • a = 10
  • b = 20
  • c = 30

Tôi muốn các giá trị được thay đổi theo danh sách sau

a = 20 
b = 30 
c = 10 

Các giá trị này có thể được chuyển trong một dòng không?

+0

Đây có phải là một câu hỏi phỏng vấn? –

+0

Có Sergei Nó được hỏi trong một cuộc phỏng vấn – Prabhu

+0

câu hỏi phỏng vấn không đề cập đến bất kỳ ngôn ngữ lập trình nào? –

Trả lời

2

Tôi đã tìm thấy giải pháp khác cho câu hỏi này.

Bạn có thể sử dụng tính năng này bằng nhiều ngôn ngữ như C,C++ and Java.

Nó cũng sẽ hoạt động với floatlong.

a=(a+b+c) - (b=c) - (c=a); 
+0

Thứ tự đánh giá không xác định ... –

1

Vì bạn không chỉ định ngôn ngữ, tôi sẽ chọn một trong những lựa chọn của tôi. Đó là Ruby.

[email protected]$ irb 
1.9.3p0 :001 > a = 10 
=> 10 
1.9.3p0 :002 > b = 20 
=> 20 
1.9.3p0 :003 > c = 30 
=> 30 
1.9.3p0 :004 > a, b, c = b, c, a # <== transfer is happening here 
=> [20, 30, 10] 
1.9.3p0 :005 > a 
=> 20 
1.9.3p0 :006 > b 
=> 30 
1.9.3p0 :007 > c 
=> 10 
+0

OP đã yêu cầu C ... –

+2

Không có C trong danh sách thẻ gốc. –

+0

Thật vậy. Nhưng có bây giờ. Có lẽ câu trả lời sẽ bị xóa ngay bây giờ câu hỏi đã được làm rõ? –

7
$ python 
>>> a, b, c = 10, 20, 30 
>>> print a, b, c 
10 20 30 
>>> a, b, c = b, c, a 
>>> print a, b, c 
20 30 10 
+0

OP được yêu cầu cho C ... –

+4

Không có C trong danh sách thẻ gốc. –

+0

@Sergei: Thật vậy. Nhưng có bây giờ. Có lẽ câu trả lời sẽ bị xóa ngay bây giờ câu hỏi đã được làm rõ? –

5

Giải pháp trong C#. Sử dụng hoán đổi xor ab trước tiên. Kết quả của việc gán là giá trị được gán, trong trường hợp này b là biến số ngoài cùng bên trái để nó được trả về là kết quả của (b ^= a^(a ^= b ^= a)). Sau đó hoán đổi cbusing the same algorithm. :)

  int a = 10; 
      int b = 20; 
      int c = 30; 
      c ^= (b ^= a^(a ^= b ^= a))^(b ^= c ^= b); 
+0

Bạn có chạy cái này không? Trong ruby ​​không hợp lệ. –

+1

rõ ràng không phải là ruby ​​... cũng không phải python ... chỉ có một loại ngôn ngữ thiếu sót để cho phép chuyển nhượng bên trong một biểu thức: C hoặc một trong các dẫn xuất (không hoàn thiện) của nó. –

+1

Tôi nghĩ rằng, có :-) Nhưng kể từ khi ruby ​​có hoạt động tương tự, tôi đã thử nó ở đó. '(b^= (a^= (b^= a)))^= c', kết quả của phần bên trái là gì? Cảm giác của tôi cho tôi biết đó là giá trị, không thay đổi. –

3

Um, tôi thích những thứ logic, giải pháp của tôi:

a= b+c-((b=c)+(c=a))+c; 

BTW: Tôi đã thử nghiệm đó (thực tế sử dụng JS) và làm việc với bất kỳ số :)

Sửa:

Tôi đã thử nghiệm với âm & số thập phân và làm việc quá :)

+4

-1: Hành vi không xác định ... thứ tự đánh giá biểu thức phụ không được chỉ định. – pmg

+0

@pmg Ha! ý bạn là gì !! –

+0

Trình biên dịch có thể chọn để làm các biểu thức con theo bất kỳ thứ tự nào nó thích: ví dụ nó có thể làm '(c = a)' trước '(b = c)' sẽ làm cho 'b' được gán giá trị trong' a '. – pmg

4

Make sử dụng toán tử dấu phẩy ...

a = 10; 
b = 20; 
c = 30; 
/* one statement */ 
tmp = a, a = b, b = c, c = tmp; /* assumes tmp has been declared */ 
assert(a == 20); 
assert(b == 30); 
assert(c == 10); 
+1

+1: Chỉ có câu trả lời đúng cho đến nay. Nhưng đối với một câu trả lời thực sự nghiệt ngã, bạn có thể kết hợp toán tử dấu phẩy với trao đổi XOR, để loại bỏ 'tmp'. 'a^= b, b^= a, a^= b, b^= c, c^= b, b^= c;' ... –

+0

Giả định! những gì nếu không được khai báo! mà sẽ làm cho mã của bạn 2 dòng (trong một số ngôn ngữ lập trình) không phải là duy nhất, và câu hỏi là rõ ràng bạn có 3 số này! để hoán đổi thành 3 biến. –

+0

@ Al-Mothafar: tuy nhiên nó hoạt động với các định nghĩa sau: 'int a = 10; gấp đôi b = 20; char c = 30; 'và khai báo' float tmp; '. Không có đề xuất nào khác. – pmg

6

Đây là một câu hỏi ngớ ngẩn. Nhưng đây là câu trả lời duy nhất (cho đến nay) có nghĩa là cả hai C được xác định rõ và thực sự là một dòng duy nhất:

a ^= b, b ^= a, a ^= b, b ^= c, c ^= b, b ^= c; 

Sử dụng XOR swap algorithm, một cách chính xác.

Lưu ý: này giả thiết rằng a, và bc đều thuộc loại số nguyên cùng (câu hỏi không rõ).

+0

'double a = 10; char b = 20; int c = 30; 'hehehe – pmg

+0

@pmg: Ah, đó là một điểm công bằng. OP không chỉ ra rằng tất cả chúng đều cùng loại. –

+0

Downvoters: chăm sóc bình luận? –

0

Hãy thử kịch bản khác nhau: Ví dụ:

a = 10 
b = 20 
c = 30 

a= a+b+c; 
b=a-b-c; 
c=a-b-c; 
a=a-b-c; 

Đối n số của,

a = 10 
b = 20 
c = 30 
. 
. 
. 
n 


a= a+b+c+......+n; 
b=a-b-c-.......-n; 
c=a-b-c-.......-n; 
. 
. 
. 
n=a-b-c-.......-n; 
a=a-b-c-.......-n;