阿里研发0304笔试情况和题解
时长:90分钟
笔试题目:6道单选+6道多选+3道编程
这次的编程题比前几天字节的简单一些,不过最后一题也挺难的,选择题只能听天由命了。。更一下编程三道题题解吧。
第一题:晶体
题目内容如下:
可以通过找规律发现,若边长是 ,那么每过1秒,单位晶体的增量会增加
。或者说,增量为一个等差数列。
可以直接模拟等差数列求和,或套用求和公式均可。代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,i;
long long res=0;
cin>>n;
for(i=0;i<n;i++){
long long a,b;
cin>>a>>b;
int d=a-2;
res+=(1+1+b*d)*(b+1)/2;
}
cout<<res;
}
这题py写起来更短:
n=int(input())
res=0
for _ in range(n):
a,b=[int(i) for i in input().split()]
res+=((b+1)+(a-2)*(1+b)*b/2)
print(int(res))
这种找规律的题,校招不多,但是竞赛里面可能签到题经常遇见,只要多练就很容易掌握技巧。
这里有一道类似的:https://www.nowcoder.com/practice/609bd97833c4441eaaabf86ddf92f9b1?tpId=196&tqId=40407&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=undefined&tags=&title=
第二题:等腰三角形
题目是:
牛牛在纸上画了一个正n边形,他想知道多边形中等腰锐角三角形的数量。(三角形的顶点要在多边形的顶点上)
不同的三角形的定义:两个三角形,只要有一个点不在同一个位置上就算做不同的三角形。
等腰锐角三角形的定义:顶角是锐角的等腰三角形被成为等腰锐角三角形。
题解:
(这道题的特判卡了我挺久了,wa了很多发。。)
显然,对于每个点而言以该点为顶角的等腰三角形数量是相同的,其数量为 。原因是,除了该点以外的
个点可以两两配对。
在形成的这 个三角形中,钝角三角形的数量一定是
个。首先需要把这个减去。之后可以算出所有的直角和锐减等腰三角形。
然后就需要处理两种特殊情况:
是4的倍数时,每个顶点可以形成一个等腰直角三角形,需要减去。
是3的倍数时。每三个顶点形成的等边三角形是同一个,这部分重复计算的需要减去。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
long long p=(n-1)/2;
p=(p+1)/2;
long long sum=n*p;
if(n%4==0)sum-=n;
if(n%3==0)sum-=n/3*2;
cout<<sum;
}
第三题:扫雷游戏
这道题数据范围是 4*4 的棋盘,所以 状压枚举就可以了。大家一定要学会看数据范围知解法的窍门(滑稽←_←)
我之前刷牛客dp专题的时候,练状压dp写二进制枚举对这个题帮助挺大的,熟练了之后十几分钟就能写完,就是判断雷的细节有点多,容易写错。具体的细节看代码吧,状压的精髓就是:
for(i=0;i<1<<n;i++) ……
利用 的二进制情况进行枚举。
#include<bits/stdc++.h>
using namespace std;
string s[5];
int main(){
int n,i,j,k,x,y;
for(i=0;i<4;i++)cin>>s[i];
int cnt=0;
int tong[4][4]={};
for(i=0;i<1<<16;i++){
int mp[4][4]={};
for(j=0;j<16;j++){
if(i&(1<<j)){
mp[j/4][j%4]=-1;
if(s[j/4][j%4]!='.')break;
}
}
if(j<16)continue;
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(mp[j][k]==-1){
for(x=-1;x<=1;x++){
for(y=-1;y<=1;y++){
if(j+x>=0&&j+x<4&&k+y>=0&&k+y<4&&mp[j+x][k+y]!=-1){
mp[j+x][k+y]++;
}
}
}
}
}
}
int jud=0;
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(s[j][k]!='.'&&s[j][k]-'0'!=mp[j][k])jud=1;
}
}
if(!jud){
cnt++;
for(j=0;j<4;j++){
for(k=0;k<4;k++){
tong[j][k]+=mp[j][k]==-1;
}
}
}
}
if(cnt==0){
cout<<-1;
}
else{
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(s[i][j]=='.'){
if(tong[i][j]==cnt)cout<<"X";
else if(tong[i][j]==0)cout<<"O";
else cout<<".";
}
else cout<<s[i][j];
}
cout<<endl;
}
}
}
之前打了一些竞赛区的算法比赛,刷了挺多算法题,然后面试也突击完牛客的剑指offer和算法首页的那个题单,感觉效果还行,手速和思维提升都挺大的。不过目前感觉自己的图论还是弱了一些,希望牛客能更新图论方面的题单
最后推荐一下我觉得对我帮助挺大的dp题单,刷过一遍之后,基本现在不是特别难的dp都能找到递推的思路:https://www.nowcoder.com/exam/oj?tab=%E7%AE%97%E6%B3%95%E7%AF%87&topicId=230
#阿里巴巴##笔经##实习##笔试时间##笔试题目#

