说明
算法部分一共面了四道题
解题思路仅供参考,可能存在更好的解法。
题目1
题意
层序遍历二叉树,每个节点有一个值(val),以链表的形式返回遍历节点对应的val。
树和链表定义如下:
struct TreeNode {
int val;
TreeNode* Left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
struct ListNode {
int val;
ListNode* next;
ListNode(int v) : val(v), next(NULL) {}
};
思路
使用队列来模拟宽度优先搜索,同时还考察了链表的基本插入操作。
代码
const int N = 1e6 + 10;
TreeNode* que[N]; //使用数组来模拟队列
int head, tail;
//插入队列
void add(TreeNode* u) {
if (u == NULL) return;
que[tail] = new TreeNode;
que[tail++] = u;
}
ListNode* bfs(TreeNode* root) {
head = tail = 0;
add(root);
ListNode* rt = new ListNode;
rt -> next = NULL;
ListNode* now = rt;
while (head < tail) {
ListNode* u = que[head++];
now -> val = u -> val;
ListNode *p = new ListNode;
now -> next = p;
p -> next = NULL;
now = p;
add(u -> left);
add(u -> right);
}
return rt;
}
题目2
题意
给定区间[x, y],问能否从这个区间中的整数挑选若干整数,使得和为K,每个数字可以重复用多次。如果能,返回其中一种构造方式。(1<=k,x,y<10^9)(x<=y)
bool Construct(int k, int x, int y, vector< int > & result);
思路
通过在纸上模拟,容易发现对于区间[x,y][x,y][x,y]中的数,任意挑选后的和其实包含在若干个区间中,如: