网易2021校招笔试-C++开发工程师(提前批)

本文提供了四个算法问题的解决方案,包括如何在保持物品总价值相等的情况下最少丢弃多少价值的物品,买票的最短时间规划,构建最短回文串的方法,以及通过图论计算学术认可的对数。每个问题都涉及到了特定的时间和空间复杂度要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

平分物品

现在有n个物品,每一个物品都有一个价值,现在想将这些物品分给两个人,要求这两个人每一个人分到的物品的价值总和相同(个数可以不同,总价值相同即可),剩下的物品就需要扔掉,现在想知道最少需要扔多少价值的物品才能满足要求分给两个人。

要求:时间复杂度O(3^n),空间复杂度O(n)

#include <bits/stdc++.h>
using namespace std;

int ans;
void dfs(vector<int> vec,int step,int a,int b,int sum){
	if(sum>ans)return ;
	if(step==vec.size()){
		if(a==b&&sum<ans)ans=sum;
		return ;
	}
	int t=vec[step];
	dfs(vec,step+1,a+t,b,sum);
	dfs(vec,step+1,a,b+t,sum);
	dfs(vec,step+1,a,b,sum+t);
}
int main() {
	int T;
	cin>>T;
	for(int _=0;_<T;++_){
		int n;
		cin>>n;
		vector<int> vec;
		int sum=0;
		for(int i=0;i<n;++i){
			int t;
			cin>>t;
			vec.emplace_back(t);
			sum+=t;
		}
		ans=0x3f3f3f3f;
		dfs(vec,0,0,0,0);
		cout<<ans<<endl;
	}
	return 0;
}

2.

买票问题

现在有n个人排队买票,已知是早上8点开始卖票,这n个人买票有两种方式:

第一种是每一个人都可以单独去买自己的票,第 i 个人花费 a[i] 秒。

第二种是每一个人都可以选择和自己后面的人一起买票,第 i 个人和第 i+1 个人一共花费 b[i] 秒。

最后一个人只能和前面的人一起买票或单独买票。

由于卖票的地方想早些关门,所以他想知道他最早几点可以关门,请输出一个时间格式形如:08:00:40 am/pm

时间的数字要保持 2 位,若是上午结束,是 am ,下午结束是 pm

进阶:时间复杂度O(n) ,空间复杂度O(n) 

#include <bits/stdc++.h>
using namespace std;
int dp[2005];

int main() {
	int T;
	cin>>T;
	for(int _=0; _<T; ++_) {
		int n;
		cin>>n;
		vector<int> a,b;
		for(int i=0; i<n; ++i) {
			int t;
			cin>>t;
			a.emplace_back(t);
		}
		for(int i=0; i<n-1; ++i) {
			int t;
			cin>>t;
			b.emplace_back(t);
		}
		memset(dp,0x3f,sizeof(dp));
		dp[0]=0;
		dp[1]=a[0];
		for(int i=2; i<=n; ++i) {
			dp[i]=min(dp[i-1]+a[i-1],dp[i-2]+b[i-2]);
		}
		int h,m,s;
		h=dp[n]/3600;
		dp[n]%=3600;
		m=dp[n]/60;
		dp[n]%=60;
		s=dp[n];
		if(h>=2)cout<<8+h<<":";
		else cout<<0<<8+h<<":";
		if(m<10)cout<<0<<m<<":";
		else cout<<m<<":";
		if(s<10)cout<<0<<s<<" am"<<endl;
		else cout<<s<<" am"<<endl;
	}
	return 0;
}

3.

小易爱回文

小易得到了一个仅包含大小写英文字符的字符串,该字符串可能不是回文串。(“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串,“asds”就不是回文串。)

小易可以在字符串尾部加入任意数量的任意字符,使其字符串变成回文串。

现在请你编写一个程序,程序要能计算出小易可以得到的最短回文串。

#include <bits/stdc++.h>
using namespace std;
bool csc(string s) {
    for (int i = 0; i < s.length() / 2; ++i) {
        if (s[i] != s[s.length() - i - 1])return false;
    }
    return true;
}
 
int main() {
    string s;
    cin >> s;
    for (int i = 0; i < s.length(); ++i) {
        if (csc(s.substr(i, s.length()))) {
            string t = s.substr(0, i);
            reverse(t.begin(), t.end());
            cout << s << t << endl;
            break;
        }
    }
    return 0;
}

4.

学术认可

在一次聚会中,教授们被要求写下自己认可哪位教授的学术成果(也可以写自己,且可能出现重复)。已知,如果教授 A 认可教授 B ,且教授 B 认可教授 C,那么即可视为教授 A 也认可教授 C。现在我们想知道有多少对教授是两两互相认可的?

#include <bits/stdc++.h>
using namespace std;
 
int cnt;
int vec[400005],head[400005],jump[400005];
void add_path(int a,int b){
    vec[++cnt]=b;jump[cnt]=head[a];head[a]=cnt;
}
 
int DFN[500005],LOW[500005];
int book[500005];
stack<int> sta;
int step;
long long ans;
void tarjan(int x){
    DFN[x]=LOW[x]=++step;
    sta.push(x);
    book[x]=1;
    for(int idx=head[x];idx;idx=jump[idx]){
        int y=vec[idx];
        if(!DFN[y]){
            tarjan(y);
            LOW[x]=min(LOW[x],LOW[y]);
        }
        else if(book[y])LOW[x]=min(LOW[x],DFN[y]);
    }
    if(DFN[x]==LOW[x]){
        long long k=0;
        while(!sta.empty()){
            ++k;
            int t=sta.top();
            sta.pop();
            book[t]=0;
            if(t==x)break;
        }
        ans+=k*(k-1)/2;
    }
}
 
int main() {
    int n,m;cin>>n>>m;
    for(int i=0;i<m;++i){
        int a,b;
        cin>>a>>b;
        add_path(a,b);
    }
    for(int i=1;i<=n;++i){
        if(!DFN[i])tarjan(i);
    }
    cout<<ans<<endl;
    return 0;
}
### 2018年网易C++职位要求 对于2018年的网易聘,针对C++开发岗位的要求主要集中在以下几个方面: - **编程能力**:熟练掌握C++语言特性及其标准库的应用。能够编写高效、可维护的代码[^1]。 - **数据结构与算法基础**:具备扎实的数据结构(如数组、链表、栈、队列、树等)以及常见算法(排序、查找、图论等)的知识背景。 - **操作系统理解**:熟悉进程管理、内存分配机制;了解Linux环境下的基本操作命令及脚本编写技巧。 - **网络编程技能**:掌握TCP/IP协议族的工作原理,有Socket编程的实际经验者优先考虑。 - **并发处理技术**:具有多线程程序设计的经验,懂得如何利用锁机制解决竞争条件等问题。 - **数据库交互**:会使用SQL语句完成增删改查操作,并且有一定的ORM框架应用经历。 - **其他加分项**:参与过高性能服务器端软件的研发工作,特别是那些涉及到大规模分布式系统的项目案例将会成为一大亮点[^4]。 ### 技能测试环节概述 在技能测评阶段,候选人通常会被安排在线上平台解答一系列关于计算机科学基础知识的选择题和技术问答题。这些题目旨在考察应聘者的理论素养和实际动手解决问题的能力。具体来说可能包括但不限于以下几类考点: #### 编程实践部分 通过给定特定场景描述或功能需求,要求考生限时提交一段完整的C++源代码片段来满足指定的任务目标。这不仅考验了个人编码水平高低同时也反映了其逻辑思维模式是否清晰严谨。 #### 笔试题型举例 ```cpp // 示例:计算斐波那契数列第n项值 int fibonacci(int n){ if(n<=1)return n; int a=0,b=1,c; while(--n>0){ c=a+b;a=b;b=c; } return b; } ``` ### 面试流程回顾 整个面试过程分为多个轮次逐步推进,每一轮侧重点有所不同但均围绕着候选人的专业知识体系和个人综合素质展开评估分析。 #### 初面——技术专项考核 由资深工程师主持对话交流活动,期间除了常规性的自我介绍之外还会就一些较为复杂的技术话题进行探讨研究。比如询问有关STL容器内部实现细节或者是模板元编程方面的见解看法等等。 #### 复面——综合能力评测 此阶段更加注重考查求职者面对真实业务挑战时所展现出来的解决方案构思能力和团队协作精神面貌。因此可能会被邀请分享过往成功克服困难的经历故事并接受考官们针对性提问质疑。 #### 终审——人力资源洽谈 最后则是HR主导的最后一关审核确认环节,在这里主要是为了进一步核实个人信息真实性的同时也给予双方更多机会相互了解彼此的文化价值观取向从而判断是否存在长期合作发展的可能性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值