【牛客】测开面经汇总
作者:互联网
虾皮测开一面面经
原文来源:虾皮测开一面面经
1.linux的性能好坏评判有什么指标
系统整体性能评估 uptime
xiaohu@DESKTOP-FE72082:~$ uptime
12:58:07 up 2 min, 0 users, load average: 0.52, 0.58, 0.59
//当前时间、系统已经运行了多长时间、目前有多少用户登录、系统在过去的 1 分钟、5 分钟和 15 分钟内的平均负载
- 操作系统级
CPU vmstat m n //每隔m秒采样1次,共n次
内存 free
磁盘I/O带宽 iostat -d m n //d:detail
网络I/O带宽 netstat - 程序应用级
影响性能因素 | 好 | 坏 | 糟糕 |
---|---|---|---|
CPU | user% + sys%< 70% | user% + sys%= 85% | user% + sys% >=90% |
内存 | Swap In(si)=0 Swap Out(so)=0 | Per CPU with 10 page/s | More Swap In & Swap Out |
磁盘 | iowait % < 20% | iowait % =35% | iowait % >= 50% |
2.linux查看各硬件资源的方法
- CPU查看
查看物理CPU个数
cat /proc/cpuinfo |grep "physical id"|sort|uniq|wc -l
查看逻辑CPU的个数
cat /proc/cpuinfo |grep "processor" |wc -l
- 内存查看
xiaohu@DESKTOP-FE72082:~$ free
total used free shared buff/cache available
Mem: 8294544 4117620 3947572 17720 229352 4043192
Swap: 25165824 48808 25117016
- 硬盘查看
查看硬盘及分区信息
fdisk -l
- 平均负载
- uptime
- top
性能调优
- 为磁盘I/O调整Linux内核电梯算法
- 禁用不必要的守护进程,节省内存和CPU资源
- 清理不需要的模块或功能
- 选择正确的文件系统
- 分析Linux服务器性能,找出导致整体速度下降的瓶颈并解决掉
- 当大型应用程序,如OpenOffice和Firefox同时运行时,计算机可能会开始变慢,内存不足的出现几率更高。
- 如果启动时真的很慢,可能是应用程序初次启动需要较长的加载时间,一旦启动好后运行就正常了,否则很可能是硬盘太慢了。
- CPU负载持续很高,内存也够用,但CPU利用率很低,可以使用CPU负载分析工具监控负载时间。
3.同步调用和异步调用的区别
同步调用是一种阻塞性调用,一段代码调用另一个代码时,必须等到执行结束返回结果,才继续执行。实时性高于异步调用。
异步调用是非阻塞调用,不需等待调用代码执行,可以通过回调函数等接收到返回结果的通知。提高系统吞吐量,简化系统之间的耦合性。
4.数组和链表的区别
- 数组是一段连续的内存空间,链表物理上不连续;
- 数组需要预留空间,可能大量空间未利用,链表根据需求动态分配删除内存,方便扩展,合理利用内存;
- 数组支持随机查询,链表通过指针查询,不支持随机查询;
- 数组的插入与删除,在起始位置修改,后面的元素会集体移动,效率低,链表只需简单的指针操作,
5.快排 时间复杂度和空间复杂度
快排
void quickSort(vector<int>& nums,int start,int end)
{
//快排的基本思想:双指针
int temp=nums[end]; //锚点
if(start>=end) return;
int l=start,r=end;
while(l<r)
{
while(l<r&&nums[l]<=temp) l++;
nums[r]=nums[l];
while(l<r&&nums[r]>=temp) r--;
nums[l] =nums[r];
}
nums[l]=temp;
quickSort(nums,start,l-1);
quickSort(nums,l+1,end);
}
平均时间复杂度O(nlog(n)),最坏时间复杂度O(n^2),
平均时间复杂度O(log(n)),最坏时间复杂度O(n)
优化
如果数组已经有序时,此时的分割就是一个非常不好的分割。因为每次划分只能使待排序序列减一,此时为最坏情况,快速排序沦为起泡排序,时间复杂度为Θ(n^2)。
- 1.三数取中取基准(处理不了重复数组)
//三数取中:使用左端、右端和中心位置上的三个元素比较,大小为中值的作为枢纽元
void selectpriot(vector<int>& nums,int left,int right)
{
if(left>=right) return;
int mid=left+(right-left)/2;
if(nums[mid]<nums[left]) swap(nums[mid],nums[left]); //目的是nums[mid]>nums[left]
if(nums[left]>nums[right]) swap(nums[left],nums[right]); //目的是nums[right]<nums[left]
if(nums[mid]<nums[right]) swap(nums[mid],nums[right]); //目的是nums[mid]>nums[right]
}
- 2.当待排序序列的长度分割到一定大小后,使用插入排序(处理不了重复数组)
void insertSort(vector<int>& nums)
{
int end=nums.size();
if(end<=1) return;
for(int i=1; i<end; i++)
{
int temp=nums[i];
int k=i-1;
while(k>=0&&nums[k]>temp)
{
nums[k+1]=nums[k];
k--;
}
nums[k+1]=temp;
}
}
- 3.在一次分割结束后,可以把与Key相等的元素聚在一起,继续下次分割时,不用再对与key相等元素分割。
void quickSort(vector<int>& nums,int start,int end)
{
//快排的基本思想:双指针
if(start>=end) return;
selectpriot(nums,start,end);
int temp=nums[end];
int l=start,r=end;
int less=l-1; //小于区的边界指针
int more=r+1; //小于区的边界指针
while(l<more)
{
if(nums[l]<temp)
{
less++;
swap(nums[less],nums[l]);
l++;
}
else if(nums[l]>temp)
{
more--;
swap(nums[more],nums[l]);
}
else l++;
}
quickSort(nums,start,less);
quickSort(nums,more,end);
}
6.智力题-烧绳子
- 第一根和第二根同时点,第一根点一头,第二根点两头
- 在第二根燃完后(30分钟),点燃第一根的另一头
- 前两根燃完后(15分钟),点燃第三根的两头
- 全部燃完后(30分钟)
一共就是1小时15分钟
7. 数据库索引的优劣
-
优点
- 1.加快数据库查询速度
- 2.加快表与表之间的连接速度
- 3.在信息检索的过程中,若使用分组及排序子句进行时,通过建立索引能够有效减少检索过程中所需的分组和排序时间,提高检索效率
-
缺点
- 需要花费的时间去建立和维护索引,而且随着数据量的增加,需要维护它的时间也会增加
- 在创建索引的时候会占用存储空间,索引文件越大,占用的空间越多
- 修改表中的数据时,索引还需要进行动态的维护,所以对数据库的维护带来了一定的麻烦。由于索引底层大多是B+树等平衡多叉树,为了维护平衡,增删的时间效率很差。
8.sql查询
查询成绩排名第三的姓名和成绩
SELECT name,grade
From sc
ORDER BY score DESC
LIMIT 2,1
- order by 优化 using filesort优化为using index(给成绩建立索引)
limit分页优化
limit10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,关键在于去掉offset
- 在索引上排序,使用关联查询原表查询
select *
from sc,(select id from sc order by id limit 10000,20) a
where sc.id=a.id;
9.TCP3次握手,4次挥手
- 3次握手 为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。主要目的防止server端一直等待,浪费资源。
- 4次挥手 Tcp是全双工通信,服务端和客服端都能发送和接收数据,三次挥手不行是因为服务器可能会有数据未发送完成,需要继续发送,因此不能将确认消息和请求关闭消息同时发送,而是会先关闭接收服务回复确认消息,然后继续发送未完消息到客户端,直到发送结束,再发送请求关闭消息.
手撕代码
输入一个字符串如: 12223334 ,输出最早出现的重复最多次的数,比如例题输出2
char freSort(string s)
{
vector<int> count(10,0);
for(auto item:s)
{
int index=item-'0';
count[index]++;
}
int maxIndex=0;
int max=0;
for(int i=0; i<10; i++)
{
if(max<count[i])
{
max=count[i];
maxIndex=i;
}
}
return maxIndex+'0';
}
标签:测开,end,nums,int,复杂度,面经,start,牛客,CPU 来源: https://blog.csdn.net/binglu1841/article/details/118652868