new
and delete
for simple objects and arrays.std::list
std::forward_list
std::vector
std::array
std::stack
std::queue
std::sort
function using a custom comparator.NOTE: Once the exam starts you are not allowed to share any items with anyone else.
Pen, pencil, eraser, pencil sharpener.
Simple scientific calculator. You are not allowed to use a cell phone, programmable calculator, tablet, computer, or any other electronic device.
Personal cheat sheet with the following characteristics:
|
You have three algorithms: A, B, and C. Algorithm A has a performance of \(O(N!)\). Algorithm B has a performance of \(O(N^3)\). Algorithm C has a performance of \(O(2^N)\). Which algorithm has the best performance? Which one has the worst?
You have the following C++ code:
#include <iostream> #include <vector> int f(int x) { int r = 0; while (x) { x /= 2; ++r; } return r; } void g(int n, std::vector<int>& v) { for (int i = 0; i < n; ++i) { v.push_back(f(i)); } }
What is the time complexity of function g
? Explain your answer.
Assume that the following code completes the program that started with the code from the previous question. What gets printed to the standard output when running the program?
int main() { std::vector<int> v; g(10, v); for (int x : v) { std::cout << x << " "; } std::cout << "\n"; return 0; }
When trying to find a certain item inside a linked list, which search algorithm should be used and what is its time complexity?
Assume you have the following C++ struct
declaration:
struct Node { int value; Node* next; };
Using this structure it is possible to create a singly linked list using dynamic memory. For example:
Write a reverse
function that inverts a linked list by changing the links between nodes. No new nodes should be created. The value
field of the nodes should not be modified. For the list shown above, the resulting inverted list should be as follows:
The signature of the reverse
function should be:
void reverse(Node*& list)
Given the following expression in postfix notation, what is the result of evaluating it?
$$ 100 \; 4 \; 5 \; 6 \; + \; * \; - \; 15 \; 3 \; / \;+ $$What gets printed to the standard output when running the following C++ code?
#include <iostream> #include <queue> #include <stack> int main() { std::stack<int> s; std::queue<int> q; q.push(4); q.push(8); q.push(15); q.push(16); q.push(23); q.push(42); while (not q.empty()) { int x = q.front(); q.pop(); if (x % 2 == 0) { s.push(x); } } while (not s.empty()) { int x = s.top(); s.pop(); std::cout << x << " "; } std::cout << "\n"; return 0; }
This sorting algorithm uses the fairly obvious fact that, if an array is not sorted, it must contain two adjacent elements that are out of order. The algorithm repeatedly passes through the array, swapping items that are out of order, until it can't find any more swaps. What’s the name of this algorithm?
What gets printed to the standard output when running the following C++ code?
#include <algorithm> #include <iostream> #include <vector> bool comparator(int a, int b) { return std::abs(a) <= std::abs(b); } int main() { std::vector<int> v {-35, 12, -43, 50, -77, -76, -8, 69}; std::sort(v.begin(), v.end(), comparator); for (int x : v) { std::cout << x << " "; } std::cout << "\n"; return 0; }