Đề bài:
Cho một mảng số nguyên nums đã được sắp xếp theo thứ tự không giảm, hãy loại bỏ các phần tử trùng lặp ngay tại chỗ sao cho mỗi phần tử duy nhất chỉ xuất hiện một lần. Thứ tự tương đối của các phần tử phải được giữ nguyên. Sau đó, trả về số lượng phần tử duy nhất trong mảng nums.
Xem số lượng phần tử duy nhất trong mảng nums là k, để được chấp nhận, bạn cần làm các việc sa
Thay đổi mảng nums sao cho k phần tử đầu tiên của nums chứa các phần tử duy nhất theo thứ tự mà chúng xuất hiện ban đầu trong nums. Các phần tử còn lại trong nums không quan trọng cũng như kích thước của nums.
Trả về k.
Ví dụ 1:
Đầu vào: nums = [1,1,2]
Đầu ra: 2, nums = [1,2,_]
Giải thích: Hàm của bạn nên trả về k = 2, với hai phần tử đầu tiên của nums là 1 và 2 tương ứng. Các phần tử sau k không quan trọng (do đó chúng có thể là bất kỳ giá trị nào).
Ví dụ 2:
Đầu vào: nums = [0,0,1,1,1,2,2,3,3,4]
Đầu ra: 5, nums = [0,1,2,3,4,_,_,_,_,_]
Giải thích: Hàm của bạn nên trả về k = 5, với năm phần tử đầu tiên của nums là 0, 1, 2, 3, và 4 tương ứng. Các phần tử sau k không quan trọng.
Ràng buộc:
1 <= nums.length <= 3 * 10^4
-100 <= nums[i] <= 100
nums đã được sắp xếp theo thứ tự không giảm.
Cách làm:
#include <iostream>
int loaiBoPhanTuTrungLap(int mang[], int kichThuoc) {
if (kichThuoc == 0) return 0;
int chiSoHienTai = 0; // chi so cho phan tu duy nhat
for (int i = 1; i < kichThuoc; i++) {
if (mang[i] != mang[chiSoHienTai]) {
chiSoHienTai++;
mang[chiSoHienTai] = mang[i];
}
}
return chiSoHienTai + 1; // tra ve so luong phan tu duy nhat
}
int main() {
int mang[] = {0,0,1,1,1,2,2,3,3,4};
int kichThuoc = sizeof(mang) / sizeof(mang[0]);
int soLuongPhanTuDuyNhat = loaiBoPhanTuTrungLap(mang, kichThuoc);
std::cout << "So luong phan tu duy nhat: " << soLuongPhanTuDuyNhat << std::endl;
std::cout << "Mang sau khi loai bo phan tu trung lap: ";
for (int i = 0; i < soLuongPhanTuDuyNhat; i++) {
std::cout << mang[i] << " ";
}
return 0;
}