说明
算法部分一共面了四道题
解题思路仅供参考,可能存在更好的解法。
题目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]中的数,任意挑选后的和其实包含在若干个区间中,如:
[ x , y ] , [ 2 x , 2 y ] . . . [ p x , p y ] ( p ∈ Z ) [x,y],[2x,2y]...[px, py](p \in Z) [x,