1. 本次面试是在牛客网平台进行的,没有涉及到技术细节,面试官也说仅仅是聊天。但是,不知道是网络卡顿还是平台缘故,连接非常不稳定,经常听不到声音,对方那边噪音也特别大,面试体验不是很好。
2. 面试时间三十分钟,大体上问了以下几个方面的问题:
- 自我介绍?
- 有没有阅读过源码的经历,假如给你一份源代码,你准备怎么阅读?
- 大学期间自学过什么知识,是如何自学的?
- 项目介绍以及目前取得的成果?
- 在项目中遇到过哪些问题,怎么解决的?
- 大学里坚持过哪些事情?
3. 前面这些问题都是一些开放性问题,只在最后问到了一个附加编程题。
给定一个无序数组,找出某一元素后面第一个比它大的数字。
思路:用栈来实现。
- 从第一个元素开始进栈,每次对栈顶元素和序列的下一个元素进行比较,直至找到第一个比它大的数再出栈。
- 若栈顶元素小于序列元素,此序列元素即为后面第一个比它大的数,栈顶元素出栈,继续进行比较;若栈顶元素大于等于序列元素,则继续将此序列元素压栈,再进行下一轮比较;若栈为空,则压入当前正在比较的序列元素。
- 若比较到最后一个元素同时栈为空或者最后一个元素依然小于等于栈顶元素,则比较结束。
代码如下:
/*
找出一个无序序列中在某个数后面第一个比它大的数
测试用例如下:
6 3 1 5 4 2 6
5 5 6 6 6
10 2 4 5 8 9 7 10 6 64 1
4 5 8 9 10 10 64 64 0
10 6 3 2 7 1 0 9 8 5 10
7 7 7 9 9 9 10 10 10
*/
#include <iostream>
#include <vector>
using namespace std;
int main()
{
int n = 0;
cin >> n;
int data[n] = {0};
int result[n-1] = {0};
int i = 0;
for(i = 0; i < n; i++)
{
cin >> data[i];
}
vector<int> num; //作为栈保存数据
vector<int> index; //保存栈中数据在原始序列中的位置
i = 0; // 初始化为 0,向栈压入第一个数据
while (1)
{
if (int(num.size()) == 0)
{
// 栈为空,并且比较到最后一个数据,循环结束
if (i == n-1)
{
cout << "exit2" << endl;
break;
}
// 栈为空,压入新的数据
num.push_back(data[i]);
index.push_back(i);
i++;
}
// 每次拿当前数据与栈顶元素比较,
// 若当前数据小于等于栈顶数据,继续压栈
int len = int(num.size() - 1);
while (num[len] >= data[i])
{
// 比较到最后一个数据仍然比栈顶小,大循环结束
if (i == n - 1)
{
cout << "exit1" << endl;
goto END;
}
num.push_back(data[i]);
index.push_back(i);
i++;
len = int(num.size() - 1);
}
// 若当前数据大于栈顶数据,当前数据即为栈顶数据后面
// 第一个比它大的数,然后弹出栈顶数据,进行下一轮比较
result[index[len]] = data[i];
num.pop_back();
index.pop_back();
}
END:for(i = 0; i < n-1; i++)
{
cout << result[i] << " ";
}
return 0;
}
个人见解,如有错误,欢迎指正与交流!
获取更多精彩,请关注「seniusen」!