Professional Documents
Culture Documents
LECTURE 05
ARRAY
Big–O Coding
Website: www.bigocoding.com
1
Green
Giới thiệu
2
Green
• Output: 9
3
Green
BT1 – Gợi ý
• BT1 có thể giải sử dụng kĩ thuật tính tổng ở buổi 3, không cần sử
dụng thêm kiến thức mới.
2. ans = 0
4. In kết quả. 4
Green
BT1 – Vấn đề
• Làm thế nào để tách biệt quá trình đọc danh sách phần tử và quá trình
cộng giá trị các phần tử?
• Làm thế nào để lưu trữ 1 mảng các phần tử (trong trường hợp này là
mảng số nguyên)?
• Giải pháp: sử dụng kiểu dữ liệu mảng có trong mỗi ngôn ngữ lập trình.
5
Green
6
Green
40
10 20 30
40
10 20 30
8
Green
a[0] = 10;
a[1] = 20;
a[2] = 30;
• Phải khai báo kiểu dữ liệu của mỗi phần tử. (int, double, int n;
Product…) cin >> n;
int a[n]; X
• Số phần tử trong mảng phải cụ thể, xác định lúc biên dịch,
int n = 3;
không dùng biến hoặc hằng số.
int a[n]; X
• Khai báo thêm biến n, số nguyên, số phần tử trong mảng a.
const int n = 3;
• n ≤ 100 int a[n]; X
9
Green
• Phải khai báo kiểu dữ liệu của mỗi phần tử. (int, double, Product…)
• Số phần tử trong mảng được xác định khi chạy chương trình.
10
Green
• Số phần tử trong mảng được xác định khi chạy chương trình.
11
Green
40
10 20 30
40
10 20 30
12
Green
a = new int[0];
System.out.print(a.length);
a = []
13
Green
14
Green
• Như vậy, nếu mảng a có n phần tử, thì chỉ số các phần tử trong
mảng là 0, 1, 2, 3,…, n–2, n–1.
15
Green
a[3] = 77;
System.out.print(a[0]);
System.out.print(a[3]);
a[3] = 77;
a = [10, 20, 30, 40]
print(a[0])
print(a[3])
a[3] = 77
16
Green
17
VD: Index là số âm (valid) Green
19
Green
for i in range(len(a)):
print(a[i])
20
Green
for(int x: a){
cout << x << endl;
}
for(int x: a){
System.out.println(x);
}
for x in a:
print(x)
21
Green
int a[100];
int n = 0;
cin >> n;
for(int i = 0; i < n; i++)
cin >> a[i];
int []a;
int n = 0;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n];
n = int(input())
a = list(map(int, input().split()))
22
Green
int []a;
int n = 0;
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
a = new int[n];
n = int(input())
a = []
for i in range(n):
x = int(input())
a.append(x)
23
Green
a = []
while(True):
x = int(input())
if(x == 0):
break
a.append(x)
24
Green
26
Green
BT1 – Gợi ý
1. Đọc mảng a.
3. Sử dụng vòng lặp for, duyệt qua các phần tử trong mảng a.
• ans += a[i].
4. In kết quả.
28
Green
29
Green
int main(){
int a[1000];
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
int ans = 0;
for(int i = 0; i < n; i++){
ans += a[i];
}
cout << ans;
return 0;
} 30
Green
32
Green
BT2 – Gợi ý
1. Đọc mảng a.
3. Sử dụng vòng lặp for, duyệt qua các phần tử trong mảng a.
• Nếu phần tử a[i] > lính canh ans, cập nhật ans = a[i].
4. In kết quả.
34
Green
35
Green
Kĩ thuật liệt kê
36
Green
BT3 – Gợi ý
1. Đọc mảng a.
2. Sử dụng vòng lặp for, duyệt qua các phần tử a[i] trong mảng a.
• Nếu a[i] là số chẵn, in a[i].
37
Green
38
Green
• Kiểm tra xem có phải tất cả các bài post đều có người like hay
không (có thể có bài post có 0 like)?
BT4 – Gợi ý
1. Đọc mảng a.
3. Sử dụng vòng lặp for, duyệt qua các phần tử a[i] trong mảng a.
• Nếu a[i] == 0, cập nhật cờ hiệu allPositive = False.
40
Green
41
Green
Kĩ thuật đếm 42
Green
BT5 – Gợi ý
1. Đọc mảng a.
3. Sử dụng vòng lặp for, duyệt qua các phần tử x trong mảng a.
• Nếu isPrime(x), tăng biến count lên 1.
4. In kết quả.
43
Green
44
Green
45
Green
46
Green
• Phải dùng vòng lặp, copy từ giá trị a[i] qua b[i].
47
Green
• Nếu gán b = a, thay đổi giá trị mảng a gây ảnh hưởng giá trị mảng b
và ngược lại.
int []a = {10, 20, 30};
int []b;
System.out.println(a[0]);
b = a;
b[0] = 100;
System.out.println(a[0]);
48
Green
• Tạo mảng b mới, có kích thước bằng mảng a, sử dụng vòng lặp gán
b[i] = a[i].
public static int[] copy(int []a){
int []b = new int[a.length];
for(int i = 0; i < b.length; i++)
b[i] = a[i];
return b;
}
49
Green
• Tương tự Java, nếu gán b = a, thay đổi giá trị mảng a gây ảnh
hưởng giá trị mảng b và ngược lại.
a = [10, 20, 30]
print(a[0])
b = a
b[0] = 100
print(a[0])
50
Green
51
Green
2. Slicing (Python)
• Python hỗ trợ toán tử slicing, cho phép lấy nhanh một dãy các phần tử
liên tiếp trong mảng.
• Sau khi slicing, thay đổi giá trị trên mảng mới không ảnh hưởng đến
mảng cũ.
a = [10, 20, 30, 40, 50, 60]
# begin = 1, end = 3
a12 = a[1:3]
# begin = 0, end = 4
a03 = a[:4]
# begin = 3
a35 = a[3:]
# all
a05 = a[:] 52
Green
2. Slicing (C++)
• C++ không hỗ trợ toán tử slicing.
• Phải dùng vòng lặp, copy từng giá trị từ mảng cũ qua mảng mới.
void slice(int a[], int n, int begin, int end, int b[], int &m){
m = end - begin;
for(int i = 0; i < m; i++)
b[i] = a[begin + i];
}
2. Slicing (Java)
• Java cũng không hỗ trợ toán tử slicing.
• Dùng vòng lặp, copy từng giá trị từ mảng cũ qua mảng mới.
a.append(40)
# 10, 20, 30, 40
a.append(50)
# 10, 20, 30, 40, 50
55
Green
56
Green
• Tạo mảng tạm b -> copy giá trị từ a qua b -> thêm x vào cuối b
-> gán a = b.
public static int[] append(int []a, int x){
int []b = new int[a.length + 1];
for(int i = 0; i < b.length - 1; i++)
b[i] = a[i];
b[b.length - 1] = x;
return b;
}
57
Green
• Sau khi kết thúc hàm, các giá trị ở mảng tương ứng bên ngoài cũng
thay đổi theo.
58
Green
int main(){
int a[] = {10, 20, 30};
int n = 3;
for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
inc(a, n);
inc(a);
60
Green
for x in a:
print(x, end=" ")
inc(a)
for x in a:
print(x, end=" ")
61
Green
Hỏi đáp
62