30/09/2018, 20:27

Giải thích giùm mình đoạn code xóa phần tử trong mảng

Giải thích giùm mình đoạn code xóa phần tử trong mảng này với

... viết 22:33 ngày 30/09/2018

Code này dùng để xóa hết tất cả các phần tử có giá trị x trong mảng.


Bạn thử nghĩ với trường hợp trong mảng không có phần tử nào có giá trị x, nghĩa là dòng ``` if(a[i] == x) count++; ``` sẽ không bao giờ được chạy. Vậy thì count sẽ luôn bằng 0, và a[i - count] sẽ là a[i] mà ``` a[i] = a[i]; ``` thì nó vẫn giữ nguyên giá trị của mọi phần tử trong mảng.

Bây giờ thử với trường hợp trong mảng có 1 phần tử có giá trị x = 3.
với mảng đc cho là

a[] = { 1, 2, 3, 4, 5 };

Khi vòng lặp đi từ phần tử giá trị 1 đến phần tử giá trị 2, lệnh được chạy trong vòng lặp vẫn là

a[i - count] = a[i]; // lúc này count vẫn bằng 0 thì kết quả như mình nói ở trên.

sau đó thì nó bắt gặp phần tử giá trị là 3 có chỉ số trong mảng là 2. Nó thực hiện tăng count lên 1.
Vậy thì trong những lần chạy còn lại.

//a[i - count] tương đương với a[i - 1]
a[i - count] = a[i];

đồng nghĩa với việc lấy phần tử hiện tại để lấp vào phần tử đứng trước. Lấp bao nhiêu lần thì tùy thuộc vào số phần tử giá trị x mà biến count đếm được.

Vậy giả sử phần tử x nó nằm cuối mảng thì sao?
Thì nó vẫn đếm vào nhưng không có phần tử nào để lấp vào đó.
Thế nên khi ra khỏi vòng lặp for, ta cho số phần tử hiện tại của mảng
bằng với số phần tử của mảng ban đầu trừ đi số lần xuất hiện giá trị x.

Quốc Lê viết 22:28 ngày 30/09/2018

Mình hiểu rồi! Cảm ơn bạn!

À! Còn nếu như muốn xóa 1 phần tử mà trước khi xóa, phần tử đó nằm ở vị trí nào thì nó sẽ TỰ ĐỘNG XÁC ĐỊNH vị trí của phần tử đó và xóa nó đi! Thì phải làm sao?

Vd: a[5] = {1,2,3,4,5}.
Muốn xóa phần tử giá trị 2 thì nó sẽ tự động xác định phần tử 2 nằm ở vị trí thứ 1 và xóa đi?

Bé tập Code viết 22:43 ngày 30/09/2018

Đề bài xóa tất cả các phần tử 5 trong mảng:

int arr[5] = {5,5,5,5,5}

code trên có hoạt động không ?

Vô Thin viết 22:33 ngày 30/09/2018

Lấy code có mấy dòng, gõ lại và cho chạy thử chứ hỏi gì, không thì viết lên bảng rồi phân tích.

quy viết 22:34 ngày 30/09/2018

ai có thể giải thích làm sao để nghĩ ra được code như vậy không?

Thế Linh viết 22:33 ngày 30/09/2018

Viết ra code như vậy thì bạn thật hiểu về vòng lặp và ứng dụng của nó. Vòng lặp bạn nên cho trình biên dịch chạy step-by-step thì bạn sẽ biết nó diễn ra như thế nào. Mình nghĩ giải thuật bạn không tốt thì bạn nên nháp thuật toán trước khi làm

quy viết 22:36 ngày 30/09/2018

Sao nghe chưa được thuyết phục cho lắm

Thánh Kuro viết 22:35 ngày 30/09/2018

Thật sự đây cũng không phải là code xóa phần tử mảng :v, do chúng ta tự hiểu như vậy thôi, không tin thì bạn cứ thử gọi tới phần tử mà bạn đã coi là xóa đó xem nó có giá trị không ???

vì sao lại có dòng code n -= count, cái biến n này cũng do bạn tự đặt ra chứ thật sự nó đâu phải là chiều dài của mảng đâu, mảng vẫn như vậy chỉ có điều là bạn copy giá trị đẩy lên trên thôi

Gió viết 22:28 ngày 30/09/2018

Đơn giản và dễ tưởng tượng là bạn có một chồng hộp tượng trưng cho mảng như sau

[ 2 ]
[ 1 ]
[ 3 ]
[ 2 ]

Công việc xoá mảng giống như việc đẩy 1 hộp có giá trị nào đó ra khỏi chồng hộp
Ví du xoá [ 2 ]

[ 2 ]
[ 1 ]
[ 3 ]
[   ]  ->  [ 2 ]    <= deleted

khi đến vị trí [ 3 ]

[ 2 ]
[ 1 ]
[   ] <=  i = 1
[ 3 ]  [  2 ]

Hộp có giá trị 3 sẽ rơi ở độ cao = những phần tử bị lấy ra. Hộp [ 1 ] cũng rơi như thế cho đến hộp cuối

[  ]
[  ]
[1]
[3]  , [2], [2]

Như thế biến count sẽ tính độ cao của hộp bị rơi xuống cùng ý nghĩa, sẽ tính được độ cao mới. Từ đó sẽ viết dc code như trên

Bé tập Code viết 22:41 ngày 30/09/2018

Hỏi để bạn đó nhận ra code bị bug trường hợp kiểu như trên, đọc kĩ mọi thứ và suy nghĩ trước khi comment nhé

Gió viết 22:33 ngày 30/09/2018

Mình nghĩ là nó không bị lỗi. Trong th của bạn, bạn nghĩ lí do bug là gi?

Bài liên quan
0