You are on page 1of 11

Đào Thị Thu Hường  ĐH

Nhà của tôi  Các khoá học của tôi  2324I_INT2210_24  23 October - 29 October  Test 3

Cấu trúc dữ liệu và giải thuật (2324I_INT2210_24) Test 3

Bắt đầu vào lúc Friday, 27 October 2023, 1:08 PM


Trạng thái Đã xong
Kết thúc lúc Friday, 27 October 2023, 3:31 PM
Thời gian thực hiện 2 giờ 22 phút
Điểm 9,20 trên 10,00 (92%)


Câu Hỏi 1 Đúng

Cho một xâu kí tự chỉ gồm các dấu ngoặc {, }, (, ), [, ]. Một xâu kí tự được định nghĩa là hợp lệ như sau:

Một xâu rỗng là một xâu hợp lệ.


Nếu xâu A là một xâu hợp lệ thì các xâu (A ), {A }, [A ] cũng là các xâu hợp lệ.
Nếu xâu A và B là xâu hợp lệ thì xâu AB cũng là xâu hợp lệ.

Bạn hãy viết chương trình kiểm tra xem một xâu kí tự có hợp lệ hay không.

Đầu vào

Dữ liệu vào gồm nhiều dòng từ bàn phím:

Dòng đầu tiên chứa số nguyên T là số lượng xâu kí tự cần kiểm tra.
T dòng tiếp theo, mỗi dòng chứa một xâu kí tự cần kiểm tra (T ≤ 10, độ dài xâu không vượt quá 104 ).

Đầu ra

Với mỗi xâu kí tự, in ra màn hình yes nếu đó là xâu hợp lệ, in ra no nếu ngược lại .

For example:

Input Result

2 yes
{()[]} no
([)]

Answer: (penalty regime: 0 %)


10
11 ▼ for (char c : s.toCharArray()) {
12 ▼ if (c == '(' || c == '{' || c == '[') {
13 stack.push(c);
14 ▼ } else if (c == ')' || c == '}' || c == ']') {
15 ▼ if (stack.isEmpty()) {
16 return "no";
17 }
18 char top = stack.pop();
19 ▼ if ((c == ')' && top != '(') || (c == '}' && top != '{') || (c == ']' && top != '[')) {
20 return "no";
21 }
22 }
23 }
24
25 ▼ if (stack.isEmpty()) {
26 return "yes";
27 ▼ } else {
28 return "no";
29 }
30 }
31
32 ▼ public static void main(String[] args) {
33 Scanner input = new Scanner(System.in);
34
35 int T = input.nextInt();
36 input.nextLine();
37 ▼ for (int t = 0; t < T; t++) {

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 2 Đúng

Cho 3 dãy số nguyên dương có độ dài tương ứng là n1, n2, n3. Nhiệm vụ của bạn là xóa bỏ ít số nhất từ đầu của 3 dãy số này sao cho tổng các phần tử của 3 dãy số này là
bằng nhau.

Đầu vào

Đầu vào từ bàn phím gồm 4 dòng. Dòng đầu tiên chứa 3 số nguyên n1, n2, n3. Dòng thứ 2 chứa n1 số nguyên dương của dãy số đầu tiên. Dòng thứ 3 chứa n2 số nguyên
dương của dãy số thứ hai. Dòng thứ 4 chứa n3 số nguyên dương của dãy số thứ ba. Các số nguyên trên cũng một dòng cách nhau bởi một dấu cách.

Đâu ra

In ra màn hình tổng của các dãy số khi đã xóa đi một số phần tử ở đầu để ba dãy số có tổng bằng nhau.

For example:

Input Result

5 3 4 5
3 2 1 1 1
4 3 2
1 1 4 1

Answer: (penalty regime: 0 %)


31 else st3.pop();
32 }
33 return ans;
34 }
35
36 ▼ public static void main(String[] args) {
37 Scanner sc = new Scanner(System.in);
38 int n1 = sc.nextInt();
39 int n2 = sc.nextInt();
40 int n3 = sc.nextInt();
41 List<Integer> arr = new ArrayList<>();
42 ▼ for (int i = 0; i < n1; i++) {
43 arr.add(sc.nextInt());
44 }
45 List<Integer> arr2 = new ArrayList<>();
46 ▼ for (int i = 0; i < n2; i++) {
47 arr2.add(sc.nextInt());
48 }
49 List<Integer> arr3 = new ArrayList<>();
50 ▼ for (int i = 0; i < n3; i++) {
51 arr3.add(sc.nextInt());
52 }
53 System.out.println(equalStacks(arr,arr2,arr3));
54 }
55 }
56
57
58

Input

5 3 4
3 2 1 1 1
4 3 2
1 1 4 1

67330 52024 97607


57 41 75 98 4 29 1 34 36 49 73 66 84 36 14 71 98 42 21 27 20 5 10 70 42 67 78 93 21 47 52 24 81 40 99 10 90 76 96 58 37 49 25 2 38

67142 68554 34302


71 45 81 22 37 18 42 46 24 33 42 24 47 71 13 88 44 55 82 65 50 22 9 84 7 31 33 1 43 86 82 6 88 56 78 62 75 75 6 83 53 3 33 33 44 49

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 3 Đúng

Cho 2 ngăn xếp chứa các số nguyên không âm A = [a1 , a2 , ⋅, an ], B = [b 1 , b 2 , ⋅, b m ] , phần tử đầu tiên là đỉnh của ngăn xếp. Pete chơi một trò chơi trên hai ngăn xếp này
như sau:

Ở mỗi lượt chơi, Pete loại bỏ một số phần tử ở đỉnh của một trong hai hàng đợi.
Pete tính tổng của các phần tử đã được loại bỏ và tính tổng của chúng.
Trò chơi kết thúc khi tổng của các phần tử được loại bỏ lớn hơn một số nguyên x cho trước.
Điểm mà Pete nhận được bằng với số phần tử đã được loại bỏ.

Bạn hãy giúp Pete tính số điểm lớn nhất mà anh ấy có thể đạt được.

Đầu vào

Đầu vào từ bàn phím gồm 3 dòng. Dòng đầu tiên chứa 3 số nguyên n, m, x (n, m 5
≤ 10 , x ≤ 10 )
6
. Dòng thứ 2 chứa n số nguyên ai . Dòng thứ 3 chứa m số nguyên bi
(ai , b i ≤ 10 )
5
. Các số nguyên trên cùng một dòng cách nhau bởi một dấu cách

Đầu ra

In ra màn hình một số nguyên duy nhất là điểm số lớn nhất mà Pete có thể đạt được

For example:

Input Result

5 4 10 4
4 2 4 6 1
2 1 8 5

Answer: (penalty regime: 0 %)


42
43 return maxCount;
44
45 }
46
47 ▼ public static void main(String[] args) {
48 Scanner sc = new Scanner(System.in);
49 int n1 = sc.nextInt();
50 int n2 = sc.nextInt();
51 int n3 = sc.nextInt();
52
53 List<Integer> h1 = new ArrayList<>();
54 List<Integer> h2 = new ArrayList<>();
55 ▼ while(n1-->0) {
56 int tmp = sc.nextInt();
57 h1.add(tmp);
58 }
59
60 ▼ while(n2-->0) {
61 int tmp = sc.nextInt();
62 h2.add(tmp);
63 }
64
65 int result = twoStacks(n3, h1, h2);
66
67 System.out.println(result);
68 }
69 }

Input Expected Got

5 4 10 4 4
4 2 4 6 1
2 1 8 5

17 26 62 6 6
7 15 12 0 5 18 17 2 10 15 4 2 9 15 13 12 16
12 16 6 8 16 15 18 3 11 0 17 7 6 11 14 13 15 6 18 6 16 12 16 11 16 11

31 34 5 1 1
4 11 16 0 18 17 9 13 7 12 16 19 2 15 5 13 1 10 0 8 0 6 16 12 15 7 1 6 19 16 2
15 8 11 16 6 0 5 11 7 9 8 6 3 3 4 8 17 14 9 5 15 15 1 19 10 0 12 8 11 9 11 18 17 14

34 31 5 1 1
15 8 11 16 6 0 5 11 7 9 8 6 3 3 4 8 17 14 9 5 15 15 1 19 10 0 12 8 11 9 11 18 17 14
4 11 16 0 18 17 9 13 7 12 16 19 2 15 5 13 1 10 0 8 0 6 16 12 15 7 1 6 19 16 2

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00. 


Câu Hỏi 4 Đúng

Viết hàm 2 hàm

static int partition(int[] arr, int low, int high)

static void quickSort(int[] arr, int low, int high)

trong giải thuật quicksort với mục tiêu sắp xếp các phần tử theo thứ tự giảm dần.

For example:

Input Result

5 9 7 4 3 1
4 1 3 9 7

Answer: (penalty regime: 0 %)

Reset answer

1 ▼ static int partition(int[] arr, int low, int high) {


2 int pivot = arr[low];
3 int i = low;
4 int j = high;
5 ▼ while (i < j) {
6 ▼ while (i <= high && arr[i] >= pivot) {
7 i++;
8 }
9 ▼ while (j >= low && arr[j] < pivot) {
10 j--;
11 }
12
13 ▼ if (i < j) {
14 int temp = arr[i];
15 arr[i] = arr[j];
16 arr[j] = temp;
17 }
18 }
19 int temp = arr[low];
20 arr[low] = arr[j];

Input Expected Got

5 9 7 4 3 1 9 7 4 3 1
4 1 3 9 7

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 5 Đúng

Cho n xâu kí tự, bạn hãy viết chương trình sắp xếp các xâu kí tự này theo thứ tự độ dài tăng dần, nếu có nhiều xâu có độ dài bằng nhau, sắp xếp các xâu này theo thứ tự từ
điển.

Đầu vào

Dữ liệu vào từ bàn phím gồm n + 1 dòng. Dòng đầu tiên chứa số nguyên n 4
.
(n ≤ 10 ) n dòng tiếp theo mỗi dòng chứa một xâu kí tự có độ dài không vượt quá 20 .

Đầu ra

In ra màn hình các xâu sau khi đã sắp xếp, mỗi xâu trên một dòng.

For example:

Input Result

5 c
aaaa bc
bc abc
c bbc
abc aaaa
bbc

Answer: (penalty regime: 0 %)

1 ▼ import java.util.*;
2 ▼ public class Solution5 {
3 ▼ public static void main(String[] args) {
4 Scanner input = new Scanner(System.in);
5 int n = input.nextInt();
6 input.nextLine();
7 List<String> strings = new ArrayList<>();
8 ▼ for(int i = 0; i < n; i++) {
9 String str = input.nextLine();
10 strings.add(str);
11
12 }
13 ▼ Collections.sort(strings, new Comparator<String>() {
14 @Override
15 ▼ public int compare(String s1, String s2) {
16 ▼ if (s1.length() != s2.length()) {
17 return s1.length() - s2.length();
18 ▼ } else {
19 return s1.compareTo(s2);
20 }
21 }
22 });
23 ▼ for (String str : strings) {
24 System.out.println(str);
25 }
26 }
27 }
28

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 6 Đúng

Cho n số nguyên, bạn hãy viết chương trình sắp xếp các số này theo thứ tự tổng các chữ số tăng dần. Tức là, tổng các chữ số của số đứng trước nhỏ hơn hoặc bằng tổng
các chữ số của số đứng sau. Nếu hai số có tổng các chữ số bằng nhau, thì số nhỏ hơn sẽ đứng trước.

Đầu vào

Dữ liệu vào từ bàn phím gồm n + 1 dòng. Dòng đầu tiên chứa số nguyên n 4
.
(n ≤ 10 ) n dòng tiếp theo mỗi dòng chứa một số nguyên không vượt quá 107 .

Đầu ra

In ra màn hình các số sau khi đã sắp xếp, các số phân tách nhau bởi một dấu cách.

For example:

Input Result

5 1000
12 2
1000 200
200 12
30 30
2

Answer: (penalty regime: 0 %)


17 int sum1 = calculateDigitSum(num1);
18 int sum2 = calculateDigitSum(num2);
19
20 ▼ if (sum1 != sum2) {
21 return sum1 - sum2;
22 ▼ } else {
23 return num1 - num2;
24 }
25 }
26 });
27
28 ▼ for (int num : numbers) {
29 System.out.println(num);
30 }
31
32 input.close();
33 }
34
35 ▼ public static int calculateDigitSum(int num) {
36 int sum = 0;
37 ▼ while (num > 0) {
38 sum += num % 10;
39 num /= 10;
40 }
41 return sum;
42 }
43 }
44

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 7 Đúng

Cho một dãy A gồm N số nguyên và số nguyên K . Đếm số lượng cặp số nguyên trong dãy A có chênh lệch bằng K .

Đầu vào

Dữ liệu vào từ bàn phím gồm 2 dòng. Dòng đầu tiên chứa 2 số nguyên N và K 5 9
(0 < N ≤ 10 , 0 ≤ K ≤ 10 ) . Dòng thứ 2 chứa N số nguyên ai thuộc dãy A (
ai < 2
31
− 1 ).

Đầu ra

In ra màn hình một dòng duy nhất chứa số lượng cặp số nguyên có chênh lệch là K .

For example:

Input Result

5 2 3
1 5 3 4 2

Answer: (penalty regime: 0 %)

1 ▼ import java.util.Scanner;
2 import java.util.Arrays;
3 ▼ public class Solution7{
4 ▼ public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 int N = input.nextInt();
7 int K = input.nextInt();
8 int [] A = new int [N];
9 ▼ for (int i =0; i<N; i++) {
10 A[i] = input.nextInt();
11 }
12 Arrays.sort(A);
13 int count = 0;
14 ▼ for (int i = 0; i < N; i++) {
15 ▼ for(int j = i + 1; j < N; j++) {
16 ▼ if(A[j] - A[i] == K) {
17 count ++;
18 }
19 ▼ if(A[j] - A[i] > K) {
20 break;
21 }
22 }
23 }
24 System.out.println(count);
25 }
26 }

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 8 Đúng một phần

Cho hai dãy số A, B chứa các số nguyên. Bạn hãy viết chương trình đếm số lượng cặp chỉ số i, j sao cho Ai + Bj = 0 .

Đầu vào

Dữ liệu vào từ bàn phìm gồm ba dòng. Dòng đầu tiên chứa 2 số nguyên m, n là số lượng phần tử trong hai dãy số A, B. Dòng thứ hai chứa m số nguyên trong dãy số A .
Dòng thứ ba chứa n số nguyên trong dãy số B. Giới hạn: n, m 5
≤ 10 , |Ai |, |Bi | ≤ 10
6
. Các số nguyên trên cùng một dòng cách nhau bởi một dấu cách.

Đầu ra

In ra màn hình số lượng cặp chỉ số i, j thỏa mãn điều kiện Ai + Bj = 0 .

For example:

Input Result

4 3 3
1 3 -2 1
2 3 -1

Answer: (penalty regime: 0 %)


11 int [] B = new int [n];
12 ▼ for (int i = 0; i< n; i++) {
13 B[i] = input.nextInt();
14 }
15 Arrays.sort(B);
16 int count = 0;
17 ▼ for(int i = 0; i< m; i++) {
18 int ai = A[i];
19 int left = 0;
20 int right = n-1;
21 ▼ while(left <= right) {
22 int mid = left + (right - left) /2;
23 int bj = B[mid];
24 ▼ if ( ai + bj ==0) {
25 count ++;
26 break;
27 ▼ } else if (ai +bj <0) {
28 left = mid + 1;
29
30
31 ▼ } else {
32 right = mid - 1;
33 }
34 }
35 }
36 System.out.println(count);
37 }
38 }

Your code failed one or more hidden tests.

Đúng một phần

Marks for this submission: 0,20/1,00.


Câu Hỏi 9 Đúng

Cho một dãy số A gồm n số nguyên được sắp xếp theo thứ tự tăng dần (các phần tử thuộc dãy A được đánh số từ 1 đến n) và một số nguyên k. Bạn hãy viết chương trình
tìm cặp số nguyên i < j sao cho Ai + Aj = k .

Đầu vào

Dữ liệu vào từ bàn phím gồm hai dòng. Dòng đầu tiên chứa 2 số nguyên n, k. Dòng tiếp theo chứa n số nguyên Ai . Giới hạn: 2 5 6
≤ n ≤ 10 , |Ai | ≤ 10 , |k| ≤ 10
6
. Các số
nguyên trên cùng một dòng cách nhau bởi một dấu cách.

Đầu ra

In ra màn hình một dòng duy nhất chứa cặp số nguyên i, j cách nhau bởi một dấu cách. Nếu có nhiều cặp i, j khác nhau thỏa mãn điều kiện, in ra cặp có giá trị i × n + j

nhỏ nhất. Nếu không tồn tại cặp i, j nào, in ra −1.

For example:

Input Result

3 6 1 3
2 3 4

Answer: (penalty regime: 0 %)


13 int i = 0;
14 int j = n - 1;
15 int minProduct = Integer.MAX_VALUE;
16 int resultI = -1;
17 int resultJ = -1;
18 ▼ while (i < j) {
19 int sum = A[i] + A[j];
20 ▼ if (sum == k) {
21 int product = (i + 1) * n + (j + 1);
22 ▼ if (product < minProduct) {
23 minProduct = product;
24 resultI = i;
25 resultJ = j;
26 }
27 i++;
28 j--;
29 ▼ } else if (sum < k) {
30 i++;
31 ▼ } else {
32 j--;
33 }
34 }
35
36 ▼ if (resultI != -1 && resultJ != -1) {
37 System.out.println((resultI + 1) + " " + (resultJ + 1));
38 ▼ } else {
39 System.out.println(-1);
40 }

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.


Câu Hỏi 10 Đúng

Mỗi khoảng số nguyên được biểu diễn bởi hai số [a, b] , trong đó a là điểm bắt đầu và b là điểm kết thúc của đoạn. Hai khoảng số nguyên [a, b] và [c, d] được gọi là chồng
lên nhau nếu chúng có điểm chung. Hợp của Hai khoảng số nguyên chồng lên nhau [a, b] và [c, d] là một khoảng mới có dạng [min(a,c), max(b,d)].

Cho n khoảng số nguyên, bạn hãy viết chương trình hợp các khoảng số nguyên này lại với nhau.

Đầu vào

Dữ liệu đầu vào gồm n + 1 dòng. Dòng đầu tiên chứa số nguyên n . n dòng tiếp theo, mỗi dòng chứa 2 số nguyên ai , bi cách nhau bởi một dấu cách là đầu và cuối của các
khoảng số nguyên. Giới hạn: (n 5
≤ 10 , |ai |, |b i | ≤ 10
9
.

Đầu ra

In ra màn hình các khoảng số nguyên sau khi đã hợp nhất theo thứ tự tăng dần (khoảng [a, b] nhỏ hơn khoảng [c, d] nếu a < c ).

For example:

Input Result

5 1 8
1 3 10 15
10 15
2 5
3 4
5 8

Answer: (penalty regime: 0 %)

1 ▼ import java.util.*;
2
3 ▼ public class Solution10 {
4 ▼ public static void main(String[] args) {
5 Scanner input = new Scanner(System.in);
6 int n = input.nextInt();
7 List<Interval> intervals = new ArrayList<>();
8 ▼ for (int i = 0; i < n; i++) {
9 int start = input.nextInt();
10 int end = input.nextInt();
11 intervals.add(new Interval(start, end));
12 }
13
14 ▼ Collections.sort(intervals, new Comparator<Interval>() {
15 ▼ public int compare(Interval a, Interval b) {
16 return a.start - b.start;
17 }
18 });
19
20 List<Interval> mergedIntervals = new ArrayList<>();
21 Interval curInterval = intervals.get(0);
22 ▼ for (int i = 1; i < n; i++) {
23 Interval nextInterval = intervals.get(i);
24 ▼ if (curInterval.end >= nextInterval.start) {
25 curInterval.end = Math.max(curInterval.end, nextInterval.end);
26 ▼ } else {
27 mergedIntervals.add(curInterval);
28 curInterval = nextInterval;

Passed all tests!

Đúng

Marks for this submission: 1,00/1,00.

◄ Test 2 Chuyển tới...

You might also like