Chuẩn bị cho kỳ thi kiểm tra năng lực lập trình, tôi đã bắt đầu giải các bài tập thuật toán. Ban đầu tôi không mấy hứng thú, nhưng sau khi giải được một vài bài, cảm giác đạt được thành quả rất tuyệt vời. Hôm nay tôi khá mệt nên chỉ làm một vài bài và kết thúc công việc sớm. Những ngày trước đó, tôi đã thức khuya để chuẩn bị đề cho các buổi họp nhóm.
Những lỗi thường gặp khi lập trình C
Đã lâu không viết code C, nhưng với sự hỗ trợ của LLM, tôi vẫn có thể viết được nhiều. Nếu tự code từ đầu, sẽ có vô số lỗi nhỏ. Xin các cao thủ chỉ giáo.
- Dấu nháy đơn
' 'dùng cho ký tự, dấu nháy kép" "dùng cho chuỗi. Cần phân biệt rõ. - Các hàm có kiểu trả về phải có lệnh
return. - Khi sử dụng
scanf, các tham số cần truyền địa chỉ bằng toán tử&. Ví dụ:scanf("%d\n", &len); - Phải sử dụng hàm
int main()và kết thúc bằngreturn 0;.
LeetCode Hot 100
1. Valid Parentheses (Các dấu ngoặc hợp lệ)
Ý tưởng chính là đẩy các dấu ngoặc mở vào một cấu trúc dữ liệu kiểu stack (ở đây sử dụng mảng temp). Khi gặp dấu ngoặc đóng, ta so sánh với phần tử trên cùng của stack. Nếu khớp, ta loại bỏ phần tử đó khỏi stack.
#include <stdbool.h>
#include <string.h>
bool isValid(char* s) {
int len = strlen(s);
char stack[len]; // Sử dụng mảng làm stack
int top = 0; // Chỉ số đỉnh stack
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == '(' || s[i] == '[' || s[i] == '{') {
// Đẩy dấu ngoặc mở vào stack
stack[top++] = s[i];
} else {
// Nếu gặp dấu ngoặc đóng
if (top == 0) {
// Stack rỗng mà gặp dấu đóng -> không hợp lệ
return false;
}
char topChar = stack[--top]; // Lấy phần tử đỉnh và giảm top
// Kiểm tra sự khớp nhau
if ((s[i] == ')' && topChar != '(') ||
(s[i] == ']' && topChar != '[') ||
(s[i] == '}' && topChar != '{')) {
return false; // Không khớp -> không hợp lệ
}
}
}
// Nếu stack rỗng sau khi duyệt hết chuỗi -> hợp lệ
return top == 0;
}
2. Two Sum (Tổng hai số)
Ý tưởng là duyệt qua tất cả các cặp phần tử có thể có để tìm ra hai số có tổng bằng target.
/**
* Lưu ý: Mảng trả về phải được cấp phát bằng malloc, giả định người gọi sẽ gọi free().
*/
int* twoSum(int* nums, int numsSize, int target, int* returnSize) {
*returnSize = 0; // Khởi tạo kích thước trả về
// Cấp phát bộ nhớ cho mảng kết quả (chứa 2 chỉ số)
int* result_indices = (int*)malloc(2 * sizeof(int));
for (int i = 0; i < numsSize; i++) {
for (int j = i + 1; j < numsSize; j++) {
if (nums[i] + nums[j] == target) {
result_indices[0] = i;
result_indices[1] = j;
*returnSize = 2; // Đặt kích thước trả về là 2
return result_indices; // Trả về kết quả ngay khi tìm thấy
}
}
}
// Nếu không tìm thấy cặp số nào
return result_indices; // Vẫn trả về mảng đã cấp phát (kích thước 0)
}
Luogu Problem Set 2023 (Tháng 1-4)
[yLOI2023] Phân tích thừa số nguyên tố
Bài toán này chỉ cần kiểm tra xem số đó có phải là số lẻ hay không. Tôi đã mắc lỗi khi nghĩ rằng hàm void cũng có thể chấp nhận được thay vì phải viết int main().
#include <stdio.h>
int main() {
int n; // Số lượng số cần kiểm tra
scanf("%d", &n);
long long numbers[n]; // Mảng để lưu các số nhập vào
for (int i = 0; i < n; i++) {
scanf("%lld", &numbers[i]);
}
for (int i = 0; i < n; i++) {
// Kiểm tra số có phải là số lẻ (chia 2 dư 1) hay không
if (numbers[i] % 2 != 0) {
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0; // Kết thúc chương trình
}