01/10/2018, 00:28
Thắc mắc xóa 1 phần tử và xóa nhiều phần tử trong C++
Các anh cho em hỏi về C++ với ạ:
-Nếu xóa 1 phần tử trong mảng biết trước vị trí k:
for(i=k; i<n; i++)
{
a[i]=a[i+1];
};
n--;
-Nếu không biết trước vị trì:
cout<<"Moi nhap k: ";
cin>>k;
for(i=0; i<n; i++)
{
if(a[i]=k)
{
a[i]=a[i+1];
n--;
}
}
em viết 2 code như trên kia có đúng không ạ???
ở trường hợp 2: em thử test với dãy n=5, arr= 1 2 3 2 5 và k=2 vậy là lẽ ra kết quả phải là: 1 3 5 chứ sao nó cứ ra 1 3 3 hoài ạ
Bài liên quan
Cần gì phức tạp thế bạn, trong C++ có hỗ trợ cho việc thêm / xóa ít / nhiều phần tử của mảng, chuỗi, vector … mà
i<n-1 mới đúng nhé
Không nên lợi dụng, sử dụng hàm có sẵn với những bài toán như thế này!
@HienVienVu code sau của bạn bị sai nhé, mỗi lần xóa 1 phần tử bạn phải dồn hết các phần tử còn lại lên rồi mới xét đến phần tử tiếp theo. Tốt nhất với bài xóa nhiều phần tử này bạn nên dùng vòng lặp ngoài là while
Đúng rồi, nên tập làm hàm cho riêng mình để xử lý luyện logic.
Nhưng khi quen rồi thì cũng không nên viết hàm riêng mà nên dùng hàm có sẵn. Vì hàm có sẵn chạy nhanh, mấy bạn giải thuật thi olympic đều nhớ những hàm như thế này
P/S: Trong C không có mấy hàm hỗ trợ như thế này nên việc xử lý mảng hơi mệt đối với những người “lười” hoặc học C++ trước đó (my personal idea)
Có chắc là chạy nhanh hơn với những hàm trên không ?
Khi độ phức tạp là 0(n^2)
Hàm được xây dựng sẵn bao giờ cũng nhanh hơn hàm do mình viết ra mà anh ?
Anh nghĩ em nên chắc chắn về những gì mình đang nói.
Đơn giản như thuật toán xóa 1 phần tử trong arrayList của Java là một hàm dựng sẵn và độ phức tạp thuật toán của nó là O(n^2).
Rõ ràng là nó sẽ lâu rất lâu so với việc sử dụng LinkList trong trường hợp xấu nhất(thường trong các kì thi olympic lớn thường sẽ đánh vào đó)
Kết luận:
Kể cả việc đi học trên trường thầy cô giáo cũng căn dặn không nên lạm dụng hàm có sẵn(Tức là bất đắc dĩ mới dùng)
Không biết mọi người thế nào nhưng tự mình viết ra cái hàm rồi dùng để xử lý bài toán của mình cũng thú vị mà
Thanks anh ^^
Giờ mới thông não ra