Danh sách câu hỏi của đề

Câu hỏi: CSD201 Cấu trúc dữ liệu và giải thuật – Bộ ôn tập thi lại số 2

50 câu trắc nghiệm kèm lời giải của môn CSD201 - Cấu trúc dữ liệu và giải thuật, xếp đúng thứ tự trong đề.

Danh sách câu hỏi

20/50 câuCòn 30
AO(n^2)
BO(1)
CO(log n)
DO(n)
Lời giải
Đáp án đúng: "O(n)". Trong danh sách liên kết đơn, mỗi nút chỉ giữ liên kết tới nút sau. Muốn chèn nút mới đứng trước một nút đã cho thì phải sửa liên kết next của nút đứng ngay trước nó, mà từ nút đã cho không có đường đi lùi; cách duy nhất là dò lại từ đầu danh sách cho tới khi gặp nút có next trỏ đúng vào nút đó. Lượt dò ấy có thể đi qua gần hết danh sách nên chi phí tỉ lệ với số nút, tức O(n), còn phần gắn liên kết chỉ là vài phép gán. "O(1)" chỉ đúng với danh sách liên kết đôi, nơi nút đã cho giữ sẵn liên kết prev tới nút trước. "O(log n)" đòi mỗi bước loại bỏ được một nửa dữ liệu như tìm nhị phân, điều không làm được trên danh sách liên kết vì không truy cập ngẫu nhiên tới phần tử giữa. "O(n^2)" ứng với hai vòng lặp lồng nhau, trong khi thao tác này chỉ cần một lượt dò.
Mở trang câu hỏi này →
Đề bài
Node f = tail.prev; // prev is a link to predecessor node
Node q = new Node(x);
q.prev = f; q.next = tail;
f.next = q; tail.prev = q;
AIt creates new node with value x at the middle of the list.
BIt inserts new node with value x after the last node.
CIt replaces the last node with new node with value x.
DIt inserts new node with value x before the last node.
Lời giải
Đáp án đúng: "It inserts new node with value x before the last node.". Mốc duy nhất đoạn mã dùng là f bằng tail.prev, tức nút áp cuối; bốn phép gán q.prev bằng f, q.next bằng tail, f.next bằng q và tail.prev bằng q khâu nút mới vào đúng khe giữa nút áp cuối và nút cuối, giữ nguyên cả head lẫn tail. Vì vậy "It creates new node with value x at the middle of the list." sai vì vị trí chèn luôn cố định ngay trước nút cuối bất kể danh sách dài bao nhiêu, với danh sách hai nút nó rơi ngay sau head; "It inserts new node with value x after the last node." sai vì muốn nối sau nút cuối thì phải gán tail.next bằng q rồi tail bằng q, mà đoạn mã không hề sửa tail; "It replaces the last node with new node with value x." sai vì nút cuối vẫn còn nguyên trong chuỗi liên kết qua q.next bằng tail và tail.prev bằng q, không nút nào bị tháo ra.
Mở trang câu hỏi này →
AO(n)
BO(1)
CO(log n)
DO(n^2)
Lời giải
Đáp án đúng: "O(1)". Khi đã có tham chiếu tới nút p, phép chèn chỉ gồm cấp phát nút mới rồi gán q.next = p.next và p.next = q; số lệnh không phụ thuộc độ dài danh sách nên chi phí là hằng số. Con số "O(n)" là chi phí khi còn phải tự đi tìm vị trí chèn từ nút đầu, còn ở đây vị trí đã được cho sẵn. Con số "O(log n)" đòi mỗi bước loại được một nửa dữ liệu, điều chỉ có khi truy cập ngẫu nhiên được như mảng hoặc khi đi theo cây cân bằng; danh sách liên kết chỉ đi tuần tự theo con trỏ. Con số "O(n^2)" ứng với hai vòng lặp lồng nhau, trong khi phép chèn này chỉ có vài lệnh gán và không vòng lặp nào.
Mở trang câu hỏi này →
Đề bài
void fun()
  { if (isEmpty())  return;
      if (head == tail)
           head = tail = null;
             else head = head.next;
  }

Specify the correct statement about the fun() method in the code above (choose the most suitable one).

AIt removes the last element of the list
BIt removes the first element of the list
CIt removes the second element of the list
DIt returns the first element of the list
Lời giải
Đáp án đúng: "It removes the first element of the list". Hàm thoát ngay nếu danh sách rỗng; nếu chỉ còn một nút thì head == tail nên cả hai mốc bị đặt null và danh sách thành rỗng; các trường hợp còn lại thì head = head.next dời đầu sang nút thứ hai, nên nút đầu cũ không còn ai trỏ tới và bị loại. Cả hai nhánh đều tác động vào phía head, nghĩa là hàm bỏ phần tử đầu, đúng hành vi dequeue của hàng đợi hoặc pop của ngăn xếp cài bằng danh sách liên kết. Phương án "It removes the last element of the list" sai vì muốn xoá nút cuối phải đi tìm nút kế cuối rồi gán lại tail, mà mã này không có vòng lặp nào. Phương án "It removes the second element of the list" sai vì head.next được dùng làm đầu mới, tức nút thứ hai được giữ lại chứ không bị bỏ. Phương án "It returns the first element of the list" sai vì hàm khai báo void và không có lệnh trả giá trị nào, nó chỉ sửa liên kết.
Mở trang câu hỏi này →
Asorted linear array
Bsorted singly linked list
CBinary search tree
Lời giải
Đáp án đúng: "sorted singly linked list". Tìm nhị phân sống nhờ việc nhảy thẳng tới phần tử giữa đoạn trong thời gian hằng số rồi bỏ nửa đoạn mỗi bước. Danh sách liên kết đơn chỉ cho đi tuần tự theo con trỏ next, muốn tới phần tử giữa phải bước qua từng nút, nên mỗi lần chia đôi đã tốn cỡ n phép đi; cộng lại còn chậm hơn chỉ dò tuyến tính một lượt, và lợi thế log n biến mất dù dữ liệu đã sắp xếp. "sorted linear array" sai vì mảng cho truy cập theo chỉ số trong thời gian hằng số, đây đúng là trường hợp mẫu mực của tìm nhị phân. "Binary search tree" sai vì tìm trên cây nhị phân tìm kiếm chính là tìm nhị phân cài bằng con trỏ: mỗi lần so khoá với nút hiện tại là một lần loại bỏ cả một cây con, không cần tính chỉ số giữa.
Mở trang câu hỏi này →
Đề bài
int x = 5;
Node f = head;
while(f.next != tail) f = f.next;
Node q = new Node(x);
q.next = tail;
f.next = q;
A7 11 6 4 3 12 8 2 5
B7 11 6 4 3 12 8 5 2
C7 11 6 4 3 12 5 8 2
D7 5 11 6 4 3 12 8 2
E5 7 11 6 4 3 12 8 2
Lời giải
Đáp án đúng: "7 11 6 4 3 12 8 5 2". Vòng lặp dừng khi f.next bằng tail nên f đứng ở nút 8, ngay trước phần tử cuối là 2. Nút mới chứa 5 được nối next vào tail rồi f.next trỏ sang nó, vậy 5 chen vào giữa 8 với 2 còn phần đầu danh sách không thay đổi. Dãy "7 11 6 4 3 12 8 2 5" đặt 5 sau 2, đòi đi tới chính tail rồi gán next của nó, khác với điều kiện dừng f.next bằng tail. Dãy "7 11 6 4 3 12 5 8 2" đặt 5 trước 8, muốn vậy f phải dừng ở 12, tức sớm hơn một nút. Dãy "7 5 11 6 4 3 12 8 2" chèn 5 vào sau nút đầu, đó là sửa next của head mà không đi dọc danh sách. Dãy "5 7 11 6 4 3 12 8 2" đưa 5 lên đầu, tức phép chèn ở head kèm việc dời biến head, trong khi đoạn mã không chạm tới head.
Mở trang câu hỏi này →
Đề bài
int x = 5;
Node f = head;
while(f.next != p) f = f.next;
Node q = new Node(x);
q.next = p;
f.next = q;
A7 11 6 4 3 9 8 2 5
B7 11 6 4 3 5 9 8 2
C7 11 6 4 3 9 5 8 2
D7 5 11 6 4 3 9 8 2
E5 7 11 6 4 3 9 8 2
Lời giải
Đáp án đúng: "7 11 6 4 3 5 9 8 2". Danh sách liên kết đơn không đi lùi được, nên muốn chèn trước nút p chứa 9 phải dò từ đầu bằng vòng while cho tới khi f.next bằng p; lúc vòng dừng, f đang ở nút 3. Hai phép gán q.next=p rồi f.next=q đặt nút 5 vào đúng giữa 3 và 9, các liên kết khác không đổi. "7 11 6 4 3 9 8 2 5" là thêm vào cuối, phải đi tới nút 2 và gán next của nó. "7 11 6 4 3 9 5 8 2" là chèn ngay sau p, muốn vậy phải gán q.next=p.next rồi p.next=q, khác hẳn hai phép gán trong mã. "7 5 11 6 4 3 9 8 2" là chèn sau nút đầu, chỉ xảy ra nếu vòng while không chạy lần nào và f còn đứng tại head. "5 7 11 6 4 3 9 8 2" là chèn vào đầu, việc đó buộc phải gán lại head mà đoạn mã không chạm tới head.
Mở trang câu hỏi này →
Đề bài
Node p1,p2; p1 = p.next;
 p2 = p1.next;
 p.next = p2;
if(p2!=null) p2.prev=p;
A7 1 6 4 3 9 2
B7 1 6 4 3 9 8
C7 1 6 4 3 8 2
D7 1 6 4 9 8 2
E1 6 4 3 9 8 2
Lời giải
Đáp án đúng: "7 1 6 4 3 9 2". Với p trỏ vào nút 9, p1 nhận nút kế tiếp là 8 và p2 nhận nút sau nữa là 2. Hai lệnh còn lại nối trực tiếp 9 với 2 theo cả hai chiều: p.next = p2 cho 9 trỏ tới 2, p2.prev = p cho 2 trỏ lùi về 9. Nút 8 không còn ai trỏ tới nên bị tách khỏi danh sách, kết quả là 7 1 6 4 3 9 2. "7 1 6 4 3 9 8" cắt mất nút 2 ở cuối, nhưng 2 đã được giữ qua p2 và được nối lại ngay. "7 1 6 4 3 8 2" xoá nút 9, trong khi 9 chính là nút p dùng làm điểm tựa và không hề bị bỏ liên kết. "7 1 6 4 9 8 2" xoá nút 3 đứng trước p, nhưng đoạn mã không chạm tới p.prev. "1 6 4 3 9 8 2" xoá nút đầu danh sách, điều chỉ xảy ra nếu có lệnh gán lại head.
Mở trang câu hỏi này →
Đề bài
int x = 35;
Node f = p.prev; // prev is a link to predecessor node
Node q = new Node(x); // Create new node with value x
q.prev = f; q.next = p;
f.next = q; p.prev = q;
A7 11 6 4 3 35 15 8 12
B35 7 11 6 4 3 15 8 12
C7 11 6 4 3 15 8 12 35
D7 11 6 4 3 15 8 35 12
E7 11 6 4 3 15 35 8 12
Lời giải
Đáp án đúng: "7 11 6 4 3 35 15 8 12". Đoạn mã lấy f bằng p.prev với p là nút 15, nên f là nút 3 đứng liền trước; bốn phép gán q.prev bằng f, q.next bằng p, f.next bằng q và p.prev bằng q khâu nút mới mang giá trị 35 vào đúng khe giữa 3 và 15, nên 35 hiện ra ngay trước 15. Vì vậy "35 7 11 6 4 3 15 8 12" sai vì chèn vào đầu còn cần gán lại head, điều đoạn mã không làm; "7 11 6 4 3 15 8 12 35" sai vì nối vào cuối phải sửa tail chứ không phải p.prev; "7 11 6 4 3 15 8 35 12" sai vì nó chèn trước nút cuối, tức mốc phải là tail.prev; "7 11 6 4 3 15 35 8 12" sai vì nó đặt nút mới sau 15, nghĩa là hai lệnh gán cuối phải dùng p.next thay cho p.prev.
Mở trang câu hỏi này →
Đề bài
int x = 5;
Node q = new Node(x);
q.prev=null;
q.next = head;
head.prev = q;
head = q;
A7 11 6 4 3 12 8 2 5
B7 11 6 4 3 12 8 5 2
C7 11 6 4 3 12 5 8 2
D7 5 11 6 4 3 12 8 2
E5 7 11 6 4 3 12 8 2
Lời giải
Đáp án đúng: "5 7 11 6 4 3 12 8 2". Đoạn mã không dùng tới p một lần nào: nó tạo nút q mang giá trị 5, đặt q.prev = null, cho q.next = head, nối head.prev = q rồi dịch head = q, nghĩa là chèn vào đầu danh sách. Giá trị 5 vì vậy đứng trước 7 và phần còn lại giữ nguyên thứ tự. Dãy "7 11 6 4 3 12 8 2 5" là chèn vào cuối, muốn vậy phải nối qua tail chứ không phải head. Dãy "7 11 6 4 3 12 8 5 2" chèn trước nút cuối, cũng không có lệnh nào trong đoạn mã chạm tới vùng đó. Dãy "7 11 6 4 3 12 5 8 2" chèn ngay sau nút 12 mà p đang trỏ, nhưng p không hề xuất hiện trong bốn lệnh gán. Dãy "7 5 11 6 4 3 12 8 2" chèn sau nút đầu, muốn vậy phải nối q.next = head.next và giữ nguyên head.
Mở trang câu hỏi này →
Aenqueue
Bappend
Cinsert
Dadd
Lời giải
Đáp án đúng: "enqueue". Hàng đợi quy định hai phép cơ bản theo đúng vị trí tác động: thêm vào đuôi gọi là enqueue, lấy ra ở đầu gọi là dequeue; cặp tên này nói rõ phần tử vào trước thì ra trước, khác hẳn cặp push và pop của ngăn xếp vốn cùng tác động một đầu. Phương án "append" là tên quen dùng cho danh sách hay chuỗi, nó chỉ nói việc nối vào cuối mà không hàm ý ràng buộc vào trước ra trước. Phương án "insert" tổng quát hơn nữa, thường kèm một vị trí chèn bất kỳ, trong khi hàng đợi không cho phép chèn vào giữa. Phương án "add" là tên chung của giao diện tập hợp trong nhiều thư viện, nó không cho biết phần tử rơi vào đầu hay đuôi, nên không phải tên truyền thống của phép thêm vào hàng đợi.
Mở trang câu hỏi này →
AObject dequeue() { if (isEmpty()) return(null); return(pool.removeFirst()); }
Bvoid dequeue(Object x) { if (isEmpty()) return(null); pool.remove(pool.size()-1); }
CObject dequeue() {if (isEmpty()) return; return(pool.remove(pool.size()-1)); }
DObject dequeue() { if (isEmpty()) return(null); return(pool.removeLast()); }
Lời giải

Đáp án đúng: "Object dequeue() {

Lời giải
if (isEmpty()) return(null);
return(pool.removeFirst());

}". Đề quy ước đầu danh sách chính là đầu hàng đợi, mà hàng đợi lấy ra ở đầu, nên phép dequeue phải gỡ phần tử đầu; với java.util.LinkedList thì removeFirst làm đúng việc đó trong thời gian hằng số, lại trả về đối tượng vừa gỡ nên kiểu trả về Object là hợp. "Object dequeue() {

Lời giải
if (isEmpty()) return(null);
return(pool.removeLast());

}" sai vì removeLast gỡ ở cuối, biến hàng đợi thành ngăn xếp vào sau ra trước. "

Lời giải
void dequeue(Object x) {
  if (isEmpty()) return(null);
  pool.remove(pool.size()-1);
}

" sai ngay ở chữ ký: hàm void không được trả về giá trị null, dequeue lại không cần tham số đầu vào, và nó cũng gỡ ở cuối. "Object dequeue() {

Lời giải
if (isEmpty()) return;
return(pool.remove(pool.size()-1));

}" sai vì lệnh return trống không biên dịch được trong hàm có kiểu trả về Object, ngoài ra nó vẫn gỡ phần tử cuối thay vì phần tử đầu.

Mở trang câu hỏi này →
AStore all variables in a program.
BUndo sequence in a text editor.
CStore a waiting list of printing jobs.
DMulti-programming.
Lời giải
Đáp án đúng: "Undo sequence in a text editor.". Ngăn xếp cho lấy ra đúng phần tử nạp vào sau cùng, và chuỗi hoàn tác cần đúng tính chất đó: thao tác vừa làm phải là thao tác được gỡ trước, nên mỗi lần chỉnh sửa người ta đẩy một bản ghi vào ngăn xếp rồi lấy ra theo chiều ngược. Việc "Store a waiting list of printing jobs." là danh sách chờ in, nó phải phục vụ theo lối ai tới trước in trước nên dùng hàng đợi. Việc "Store all variables in a program." cần đọc biến theo tên ở bất kỳ lúc nào, còn ngăn xếp chỉ cho thấy phần tử trên đỉnh, vì vậy bảng ký hiệu hay vùng nhớ cấp phát động mới là chỗ chứa. Việc "Multi-programming." là điều phối nhiều chương trình cùng chạy, bộ điều phối luân phiên theo lượt chờ nên cũng dựa vào hàng đợi chứ không dựa vào trật tự vào sau ra trước.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then pop and write the poped character to the screen

Đề bài
  else
  push the character into the stack
}

What is written to the screen for the input "Go*od**Mor*ni**ng*Si*r" ?

Adonrnoo
BdonrniM
CdonrniG
Dodoringi
EodoringS
Lời giải
Đáp án đúng: "odoringi". Ở đoạn mã này mỗi dấu sao lấy một phần tử ra khỏi ngăn xếp và in ngay, nên chuỗi in ra chính là dãy phần tử bị lấy ra theo thứ tự. Chạy tay: G, o vào rồi dấu sao in o; o, d vào rồi hai dấu sao in d và o; M, o, r vào rồi dấu sao in r; n, i vào rồi hai dấu sao in i và n; n, g vào rồi dấu sao in g; S, i vào rồi dấu sao in i. Ghép lại được o, d, o, r, i, n, g, i. "donrnoo" là một dãy đọc ngược, nó chỉ đúng nếu chương trình giữ ký tự lại rồi in một lượt ở cuối. "donrniM" cũng đọc ngược và còn in cả M, mà M vẫn nằm trong ngăn xếp khi xâu đã hết. "donrniG" đọc ngược và kết bằng G, trong khi G nằm tận đáy và không dấu sao nào lấy tới nó. "odoringS" khớp bảy ký tự đầu nhưng kết bằng S, còn dấu sao cuối lấy ra i vì i đã đè lên S và đang ở đỉnh.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then pop the stack

Đề bài
    else
     push the character into the stack
 }
while(the stack is not empty)

pop and write the poped character to the screen What is written to the screen for the input "Good*Mor**ni***ngSir" ?

AriSgnooGi
BriSgnoGo
CriSgnooG
DGMongS
EriSgnooS
Lời giải
Đáp án đúng: "riSgnooG". Dấu sao chỉ lấy bỏ ký tự ở đỉnh mà không in, phần in dồn vào vòng xả cuối nên thứ tự ra ngược với thứ tự nạp. Chạy tay theo đúng thứ tự ký tự của từ: nạp G, o, o, d rồi một dấu sao bỏ d, còn G, o, o; nạp M, o, r rồi hai dấu sao bỏ r và o, còn G, o, o, M; nạp n, i rồi ba dấu sao bỏ i, n và M, còn G, o, o; nạp n, g, S, i, r. Ngăn xếp cuối cùng tính từ đáy lên là G, o, o, n, g, S, i, r nên xả ra cho r, i, S, g, n, o, o, G. "riSgnoGo" đổi chỗ hai ký tự dưới đáy, nhưng G nạp đầu tiên nên bắt buộc ra sau cùng. "riSgnooS" để S ở đáy dù S chỉ được nạp một lần, ở gần cuối từ. "riSgnooGi" dài chín ký tự, thừa một so với tám ký tự còn lại trong ngăn xếp. "GMongS" đi theo chiều nạp vào và còn giữ M, chữ đã bị dấu sao thứ sáu lấy bỏ.
Mở trang câu hỏi này →
AObject pop() {if (isEmpty()) return; return(pool.remove(pool.size()-1)); }
Bvoid pop(Object x) { if (isEmpty()) return(null); pool.remove(pool.size()-1); }
CObject pop() { if (isEmpty()) return(null); return(pool.remove(pool.size()-1)); }
DObject pop() { if (isEmpty()) return(null); return(pool.remove(pool.size())); }
Lời giải

Đáp án đúng: "Object pop() {

Lời giải
if (isEmpty()) return(null);
return(pool.remove(pool.size()-1));

}". Cuối danh sách được coi là đỉnh ngăn xếp, mà java.util.ArrayList truy cập theo chỉ số nên phần tử đỉnh có chỉ số size()-1; lệnh remove(pool.size()-1) vừa tháo phần tử đó vừa trả chính nó về, đúng ngữ nghĩa pop là lấy ra và trả về, và xoá ở cuối mảng không phải dồn phần tử nào nên vẫn rẻ. Vì vậy "Object pop() {

Lời giải
if (isEmpty()) return;
return(pool.remove(pool.size()-1));

}" sai vì hàm khai báo trả Object mà lại có lệnh return trống, không biên dịch được. "

Lời giải
void pop(Object x) {
  if (isEmpty()) return(null);
  pool.remove(pool.size()-1);
}

" sai vì hàm void không thể return(null), lại nhận tham số và không trả gì nên phần tử ở đỉnh bị mất luôn thay vì được giao cho người gọi. "Object pop() {

Lời giải
if (isEmpty()) return(null);
return(pool.remove(pool.size()));

}" sai vì chỉ số hợp lệ chỉ tới size()-1, nên remove(pool.size()) luôn ném IndexOutOfBoundsException.

Mở trang câu hỏi này →
Avoid push(Object x) { Node p = new Node(x); p.next = head; head=p; }
Bvoid push(Object x) { Node p = new Node(x); p.next = head; }
Cvoid push(Object x) { Node p = new Node(x); p.next = null; head=p; }
Dvoid push(Object x) { Node p = new Node(x); p.next = head; head=p.next; }
Lời giải

Đáp án đúng: "

Lời giải
void push(Object x) {
  Node p = new Node(x);
  p.next = head;
  head=p;
}

". Với danh sách liên kết đơn mà nút đầu là đỉnh ngăn xếp, phép đẩy phải làm đúng hai việc theo đúng thứ tự: cho nút mới trỏ sang đỉnh cũ bằng p.next = head, rồi dời chính đỉnh về nút mới bằng head = p; nhờ vậy toàn bộ phần dưới của ngăn xếp vẫn liền mạch. Bản "

Lời giải
void push(Object x) {
  Node p = new Node(x);
  p.next = head;
}

" thiếu lệnh dời đỉnh, nên head vẫn chỉ vào nút cũ và nút vừa tạo không ai trỏ tới, ngăn xếp coi như không thay đổi. Bản "

Lời giải
void push(Object x) {
  Node p = new Node(x);
  p.next = null;
  head=p;
}

" cắt liên kết tới phần cũ: head chỉ vào nút mới nhưng nút mới trỏ vào null, nên mọi phần tử đã đẩy trước đó mất hết. Bản "

Lời giải
void push(Object x) {
  Node p = new Node(x);
  p.next = head;
  head=p.next;
}

" gán head bằng p.next, mà p.next vừa được đặt bằng head, nên head giữ nguyên giá trị cũ và nút mới bị bỏ rơi.

Mở trang câu hỏi này →
AUndo sequence in a text editor.
BStore all variables in a program.
CKeeping track of local variables at run time.
DMulti-programming.
Lời giải
Đáp án đúng: "Multi-programming.". Đa chương trình phải xếp các tiến trình đang chờ theo đúng thứ tự tới để lần lượt cấp CPU hoặc thiết bị, tức cần một cấu trúc vào trước ra trước, chính là hàng đợi; đây là ví dụ kinh điển của hàng đợi trong hệ điều hành. Phương án "Undo sequence in a text editor." cần lấy ra thao tác vừa làm gần nhất, tức vào sau ra trước, nên đó là việc của ngăn xếp. Phương án "Keeping track of local variables at run time." cũng là ngăn xếp: khung hoạt động của lời gọi nào mở sau thì phải đóng trước, nên biến cục bộ sống và chết theo kỷ luật đó. Phương án "Store all variables in a program." không phải việc của hàng đợi mà của bảng ký hiệu hay bảng băm, vì ở đó ta cần tra theo tên trong thời gian gần như hằng số, chứ không cần thứ tự vào ra.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then dequeue and write the dequeued character to the screen

Đề bài
  else
  enqueue the character into the queue
}

What is written to the screen for the input "H*owAre***You**To****Day" ?

AowAreYouTo
BHowAreYou
CHowAreYouT
DwAreYouTo
Lời giải
Đáp án đúng: "HowAreYouT". Hàng đợi trả ra theo đúng thứ tự nhận vào, nên mỗi dấu sao in chữ cái vào sớm nhất mà chưa in. Dãy nhập có mười dấu sao nên màn hình nhận mười chữ, lấy từ dãy chữ cái vào lần lượt là H, o, w, A, r, e, Y, o, u, T, o, D, a, y; mười chữ đầu của dãy đó cho HowAreYouT, phần o, D, a, y còn nằm lại trong hàng đợi. "HowAreYou" sai vì nó chỉ có chín chữ, tức bỏ sót một dấu sao trong cụm bốn sao trước chữ D. "owAreYouTo" sai vì nó bỏ chữ H, nhưng H vào đầu tiên nên dấu sao ngay sau nó phải in ra chính H. "wAreYouTo" sai vì nó vừa thiếu một chữ so với số dấu sao, vừa bỏ cả H và o là hai chữ vào sớm nhất.
Mở trang câu hỏi này →
Đề bài
while(there are more characters in the word to read)

{read a character if a character is '*' then dequeue the queue

Đề bài
    else
     enqueue the character into the queue
 }
while(the queue is not empty)

dequeue and write the dequeued character to the screen What is written to the screen for the input "Goo***dAft**er**no**on" ?

Aernoo
Bnoon
Cternoo
Dfterno
Lời giải
Đáp án đúng: "noon". Ở đoạn mã này dấu sao chỉ lấy ra rồi bỏ đi mà không in; chỉ khi đọc hết chuỗi mới lần lượt lấy ra và in phần còn lại theo lối vào trước ra trước. Nạp G, o, o rồi ba dấu sao bỏ sạch cả ba; nạp d, A, f, t rồi hai dấu sao bỏ d với A, còn f, t; nạp e, r rồi hai dấu sao bỏ f với t, còn e, r; nạp n, o rồi hai dấu sao bỏ e với r, còn n, o; cuối cùng nạp o, n mà không còn dấu sao nào, nên hàng đợi giữ n, o, o, n. Chuỗi "fterno" dài sáu ký tự và còn giữ f, t, hai ký tự đã bị cặp dấu sao ngay sau chúng loại đi. Chuỗi "ternoo" cũng dài sáu, giữ t cùng e, r, trong khi e, r đã bị cặp dấu sao kế tiếp lấy ra. Chuỗi "ernoo" dài năm ký tự, giữ e, r rồi nối n, o, o mà đánh rơi n nạp sau cùng; chuỗi vào có 13 chữ cái và 9 dấu sao nên hàng đợi phải còn đúng bốn ký tự.
Mở trang câu hỏi này →