秋招日寄|海康威视软件开发工程师-应用笔试20240904
试卷名称: 软件开发工程师-应用
开始时间: 2024-09-04 12:00 星期三
考试时长: 90 分钟
结束时间: 2024-09-05 23:59 星期四
第一题:单选题*15
第二题:多选题*5
第三题:简答题*2
第四题:编程题*1(从C和C++选)
简答题1:
关键字static的作用
简答题2:
根据宏定义写出如下函数打印输出
#define MAX VAL(a,b) (a) > (b) ? (a) : (b)
#define MIN _vAL(a,b) (a) = (b) ? (a) : (b)
int max_min_test(void) {
int a = 2, b = 1, ret = 0;
ret = MAX_VAL(a, b) + 3;
printf("%d\n", ret);
ret = MIN_VAL(b, a) + 3;
printf("%d\n", ret);
return 0;
}
编程题:
题目描述:
输入两个链表,找出他们的第一个公共结点。链表结点定义如下:
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
假设链表1的长度为m,链表2的长度为n,求时间算法复杂度。
输入描述:
依次输入两个数组,
先输入第一个数组的长度,再输入数组值,然后输入第二个数组的长度,以及第二个数组值,
输入公共节点的值,
输入从第一个数组第几个值开始公共部分;
输入从第二个数组第几个值开始公共部分。
输出描述:
打印输出第一个公共节点的值,以及打印时间复杂度。
比如输入:
5
4 1 8 4 5
6
5 0 1 8 4 5
8
2
3
输出:
8
O(m+n)
#include <iostream>
using namespace std;
struct ListNode {
int m_nKey;
ListNode* m_pNext;
};
int getLength(ListNode* head) {
int length = 0;
while (head != nullptr) {
length++;
head = head->m_pNext;
}
return length;
}
ListNode* findFirstCommonNode(ListNode* head1, ListNode* head2) {
int len1 = getLength(head1);
int len2 = getLength(head2);
if (len1 > len2) {
int diff = len1 - len2;
while (diff--) head1 = head1->m_pNext;
}
else {
int diff = len2 - len1;
while (diff--) head2 = head2->m_pNext;
}
while (head1 != nullptr && head2 != nullptr) {
if (head1 == head2) return head1;
head1 = head1->m_pNext;
head2 = head2->m_pNext;
}
return nullptr;
}
int main() {
int m, n;
cin >> m;
ListNode* head1 = nullptr;
ListNode* tail1 = nullptr;
for (int i = 0; i < m; ++i) {
int val;
cin >> val;
ListNode* newNode = new ListNode{val, nullptr};
if (head1 == nullptr) head1 = tail1 = newNode;
else {
tail1->m_pNext = newNode;
tail1 = newNode;
}
}
cin >> n;
ListNode* head2 = nullptr;
ListNode* tail2 = nullptr;
for (int i = 0; i < n; ++i) {
int val;
cin >> val;
ListNode* newNode = new ListNode{val, nullptr};
if (head2 == nullptr) head2 = tail2 = newNode;
else {
tail2->m_pNext = newNode;
tail2 = newNode;
}
}
int commonVal, index1, index2;
cin >> commonVal >> index1 >> index2;
ListNode* commonNode = new ListNode{commonVal, nullptr};
tail1->m_pNext = commonNode;
tail2->m_pNext = commonNode;
for (int i = index1; i < m; ++i) {
int val;
cin >> val;
ListNode* newNode = new ListNode{val, nullptr};
commonNode->m_pNext = newNode;
commonNode = newNode;
}
ListNode* result = findFirstCommonNode(head1, head2);
if (result) cout << result->m_nKey << endl;
cout << "O(m+n)" << endl;
return 0;
}
#通信硬件人笔面经互助#SAGIMA笔面经整理 文章被收录于专栏
本人在秋招过程中的一些笔试和面经,尽可能的结构化、系统化的整理了,有些细节可能记不太清,大家可以随便提问,肯定知无不言言无不尽!

