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 ạ

Người bí ẩn viết 02:29 ngày 01/10/2018

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à

str.erase(x, y); // Xóa đi y ký tự bắt đầu tại vị trí x.
str.erase(str.begin() + x); // Xóa đi ký tự tại vị trí x.
str.erase(str.begin() + x, str.begin() + y); // Xóa đi các ký tự từ chỉ số x đến chỉ số y - 1

str.insert(x, “y”); // Thêm chuỗi y vào vị trí x.
str.insert(x, “y”, z); // Thêm z ký tự từ chuỗi y vào vị trí x. Nếu z có độ dài lớn hơn độ dài chuỗi y thì tiếp tục thêm vào 1 khoảng trắng và sau đó lại bắt đầu thêm vào các ký tự của chuỗi từ vị trí 0 --> sao cho đủ z thì thôi.

str.insert(x, y, ‘z’); // Thêm y lần ký tự z vào vị trí x.
str.insert(str.begin() + x, ‘y’); // Thêm ký tự y vào vị trí x.
str.insert(str.begin() + x, y, ‘z’); // Thêm y lần ký tự z vào vị trí x.
str.insert(str.begin() + x, str2.begin() + y, str2.begin() + z); // Thêm chuỗi ký tự con của chuỗi str2 bắt đầu từ vị trí y cho đến vị trí z - 1 vào vị trí x trong chuỗi str.

int found = str.find(‘x’);
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của ký tự x trong chuỗi str.
else => Không tồn tại ký tự x trong chuỗi str.

int found = str.find(“x”);
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của chuỗi x trong chuỗi str.
else => Không tồn tại chuỗi x trong chuỗi str.

int found = str.find(“x”, y, z);
if(found != string::npos) => trả về found chính là vị trí xuất hiện đầu tiên của chuỗi x lấy ra z ký tự và sẽ bắt đầu tìm kiếm từ vị trí y trong chuỗi str.
else => Không tồn tại chuỗi x trong chuỗi str.

Nguyễn Hoàng Trung viết 02:38 ngày 01/10/2018

i<n-1 mới đúng nhé

Ngô Doãn Tuấn viết 02:41 ngày 01/10/2018

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!

Thuandd viết 02:30 ngày 01/10/2018

@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ười bí ẩn viết 02:36 ngày 01/10/2018

Đú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)

Ngô Doãn Tuấn viết 02:36 ngày 01/10/2018

Vì hàm có sẵn chạy nhanh

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)

Người bí ẩn viết 02:35 ngày 01/10/2018

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 ?

Ngô Doãn Tuấn viết 02:43 ngày 01/10/2018

bao giờ cũng nhanh hơn hàm do mình viết ra

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 đó)

update:
Hàm đó, vừa được cập nhật lại một hàm mới : 0(n).


Kết luận:

  • Nếu mới học để hiểu vấn đề thì đừng khuyên họ dùng hàm có sẵn. Để nắm vấn đề rõ hơn trước
    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)
  • Hàm được viết sẵn không phải bao giờ cũng tốt? Nếu tốt rồi thì việc gì học phải liên tục update sửa đổi.
    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à
Người bí ẩn viết 02:33 ngày 01/10/2018

Thanks anh ^^
Giờ mới thông não ra

Bài liên quan
0