Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

  2. #2

    Đi phỏng vấn gặp hàm swap bị rớt, anh em giúp dùm

    Mình đi pv ở cty bên lập trính web asp.net và được ra cái đề dễ thế này. Mình làm liền không được và rớt.
    Anh em giúp dùm, vì mình quên không hỏi đáp án, mà mình mò không ra.
    void swap( a, b)
    viết hàm swap mà không dùng thêm biến nào khác ngoài a và b.
    Phải lường hết các trường hợp tràn số, lỗi linh tinh,..

    ấp án của mình là.

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

    thế mà vẫn sai, vì nếu tràn số thì vẫn bị sai. ai bik đáp án cho em xin....

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi VNFox
    void swap( &a, &b)

    Mình nghĩ là bạn nên cộng rồi sau đó trừ, ví dụ:
    a = 3
    b = 2

    a= a + b (5)
    b = a - b (5-2) Giờ b = 3
    a = a - b (5-3) giờ a = 2

    Chỉ vậy thôi, và nhớ là ... nó phải là dạng reference ... nếu không reference thì không thay đổi được ... nếu làm vậy bị SAI mình nghĩ là người chấm cho bạn không thích bạn rồi [IMG]images/smilies/smile.png[/IMG]

    XOR cũng ok ... nhưng nói chung là 2 cái điều có issue ... nếu a = b. 2 cái điều bị 0 hết .... tốt nhất là sài Temp [IMG]images/smilies/smile.png[/IMG]

    Nhưng mình nghĩ dùng temp là good nhất! (works for numeric, string, ects)
    Chính xác. HIện nay các trình dịch đủ thông minh để hiểu phép swap bằng temp, cho nên lần sau nó sẽ tự động tham chiếu đến đúng nơi. Còn nhanh hơn cả XOR hay +- nữa.

  4. #4
    void swap( &a, &b)

    Mình nghĩ là bạn nên cộng rồi sau đó trừ, ví dụ:
    a = 3
    b = 2

    a= a + b (5)
    b = a - b (5-2) Giờ b = 3
    a = a - b (5-3) giờ a = 2

    Chỉ vậy thôi, và nhớ là ... nó phải là dạng reference ... nếu không reference thì không thay đổi được ... nếu làm vậy bị SAI mình nghĩ là người chấm cho bạn không thích bạn rồi [IMG]images/smilies/smile.png[/IMG]

    XOR cũng ok ... nhưng nói chung là 2 cái điều có issue ... nếu a = b. 2 cái điều bị 0 hết .... tốt nhất là sài Temp [IMG]images/smilies/smile.png[/IMG]

    Nhưng mình nghĩ dùng temp là good nhất! (works for numeric, string, ects)

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hai số cùng kiểu lấy số lớn hơn trừ số bé hơn thì mình thấy chưa tràn số bao giờ, ai có ví dụ phép trừ bị tràn có thể cho mình mở rộng tầm mắt được không? tks.

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Một số dương trừ số âm thì liệu có xảy ra tràn số ko bạn?

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Cảm ơn mọi người, lúc vào pv rối quáng lên không nhớ được gì ! với lại bạn nào giải quyết được tràn số không? vì thấy cộng hay trừ mình thấy nó vẫn tràn số mà?

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    XOR + - đều ko làm đc swap(a, a) [IMG]images/smilies/smile.png[/IMG] (trừ phi bạn if(&a != &b))
    Nếu swap theo kiểu XOR/+/- thì ko làm đc với floating-point (deref ra int thì đc) và object (ko phải class nào cũng có +/- ...)

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Nếu a và b là kiểu số thì bạn nên dùng phép trừ, vì phép trừ không gây tràn số.
    a= b-a
    ,b= b-a
    ,a= b+a
    làm như vừa rồi sẽ không có thằng nào báo lỗi, ngoại trừ a & b khác kiểu dl.
    Nếu a,b là chuỗi thì không bị tràn số (hiển nhiên) nhưng sẽ bị giới hạn maxLength, cách giải chỉ là ghép chuỗi và substr thôi.
    Vậy đề bạn gặp phải a & b mang kiểu dl gì?

    Họ chấm bạn rớt không phải vì giải thuật của bạn kém mà là cách bạn tìm ra hướng giải quyết vấn đề.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    @MrFox: Dùng XOR trong trường hợp này là đúng rồi bạn, nó chỉ sai khi reference A = reference B, còn nếu A = B thì vẫn đúng.
    Thứ 2 là cách swap chủ thread nói vấn đề sai là do tràn số, thực ra cái này mình test với C thì nó vẫn đúng vì phép tràn này chỉ wrap around, nhưng đối với các ngôn ngữ khác thì không chắc nó sẽ ra sao.
    @ Hoangthi: Trừ hay cộng thì vẫn tràn thôi bạn

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •