1.下列程序的执行后的结果为()
#include <iostream>
using namespace std;
int foo(int n)
{
if(n<1)
return n;
return foo(foo(n-1)+foo(n-2));
}
int main()
{
cout<<foo(5)<<endl;
return 0;
}
2.以下代码中,不算main这个进程自身,一共创建了多少个进程?
PS: 前后两个fork(),4个进程。中间的条件共有8种情况,其中5种为真。所以总共有20个进程。
int main(int argc, char*argv[])
{
fork();
fork() && fork() || fork();
fork();
}
3.原二叉树先序遍历为:30,24,15,27,29,46;(根左右)
中序遍历为:15,24,27,29,30,46;(左根右)
求其转换为平衡二叉树后的后序遍历结果。
4.TCP协议中的‘三次握手’过程中的第二次握手中,Server收到数据包后由标志位SYN=1知道Client请求建立连接,Server将标志位SYN和ACK都置为1,ack=J+1,随机产生一个值seq=K,并将该数据包发送给Client以确认请求连接,serve随后进入什么状态?
5.下列代码的输出结果为()
#include <iostream>
using namespace std;
int fun(int i)
{
if(i == 1)
return 1;
else
return (fun(i-1)+i*i*i);
}
int main()
{
int sum = fun(3);
cout<<sum<<endl;
return 0;
}
6.函数的返回类型前加上static关键字,函数即被定义为静态函数,一下关于静态函数的描述正确的是:
A 静态函数中声明的变量是静态变量
B 静态函数无法访问属于类对象的静态数据成员,也无法访问非静态成员函数,它只能调用其余的静态成员函数
C 其他文件中不可以定义相同名字的函数,不然会发生冲突
D 静态函数可以被其他文件所用
7.编程题:
合唱队的N名学生站成一排,且从左到右编号为1到N,其中编号为i的学生身高为Hi。现在将这些学生分成若干组(同一组的学生编号连续),并让每组学生从左到右按身高从低到高进行排列,使得最后所有学生同样满足从左到右身高从低到高(中间位置可以等高),那么最多能将这些学生分成多少组?
输入
第一行包含一个整数N,
第二行包含N个空格隔开的整数到
,
输出
输出能分成的最多组数
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
vector<int> copy(arr);
sort(copy.begin(),copy.end());
long tmp1 = 0, tmp2 = 0,res = 0;
for(int i = 0;i<arr.size();++i){
tmp1 += arr[i];
tmp2 += copy[i];
if(tmp1 == tmp2){
++res;
tmp1 = 0;
tmp2 = 0;
}
}
return res;
}
};
8.编程题
在英文输入中,我们经常会遇到大小写切换的问题,频繁切换大小学会增加我们按键次数,也会降低我们的打字效率。
众所周知,切换大小写有两周方式,一种是按下“caps locks”,也就是大写锁定键,这样一来,之后的输入模式都会被切换,另一种是同时按下shift和需要打印的字母,可以临时切换大小写(算作按下两个键)
已知在初始状态下,打字模式是小写,现在给出需要打印的字符串(区分大小写),请你计算出最少需要多少次按键才能打印出来。
输入
输入第一行仅包含一个正整数n,表示字符串的长度()
输入第二行包含一个长度为n的字符串,仅表示大小写字母
输出
打印出字符串(区分大小写)所需要的最少按键次数(统计的是按键的总数)