有一点比较纳闷的是,这个岗我没投,可能后来被其他部门捞起来了,我记得之前投的岗简历都没过。而且发来的邮件是c++/java,但是笔试界面的标题就是研发工程师JAVA。纳闷
昨天晚上7-8点,一个小时的笔试,两道编程题,开手机监控屏幕监控和摄像头,环境调试也就一分钟左右就ok。
阿里的笔试是测试样例只是用来测试,基本上后台数据是没有测试样例的,所以不会写的话也没法通过输入直接输出去混得分点。
第一道编程题
(没写出来)
题目:给一个 (n) ,表示一个 (n*3) 的矩形,现在手里有若干张为1、2、3的牌,现在我们需要往每个方格里去放牌,放牌的要求是:当前位置的牌要和它上下左右不一样。问有多少种不同的方法数(方法数对 (10^9+7) 取余)。
思路:DFS尝试失败,暴力尝试失败
第二道编程题
(过了20%的数据)
题目:给出 (n)、(s)、(t),分别表示有 (n) 条地铁线,起点,终点。
接下去 (n*2) 行,一行先给出一个 (k) ,下面一行给出这条地铁线上的 (k) 个站点。
如果两条线中有相同的站点,说明可以进行转车。
问:从 (s) 到 (t) 最少要转几次地铁。
思路1:vector直接写失败,并查集尝试失败。直接写了特殊样例的判断过了20%的数据(不存在 (s) 或 (t) ; (s) 和 (t) 在一条线上)
思路2:后来找了大佬问一下,正确解法应该是:可以把同一条地铁线上的所有站点之间距离设为0,其他站点之间设为1,最后转化图,然后 (s) 到 (t) 直接转换成最短路就行了。有道理。
我的代码:(过了20%的数据)
#include<iostream>
#include<string.h>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f
typedef long long ll;
const int N=1e5+10;
int n,s,t;
int main()
{
bool flag1=0,flag2=0,flag=0;
scanf("%d %d %d",&n,&s,&t);
for(int i=0;i<n;i++)
{
int k;
scanf("%d",&k);
int xx=0,yy=0;
int x,y;
cin>>x;
for(int j=2;j<=k;j++)
{
cin>>y;
if(y==s) flag1=1,xx++;
if(y==t) flag2=1,yy++;
}
if(xx==1&&yy==1) flag=1;
}
if(!flag1&&!flag2)
printf("-1
");
else if(flag)
printf("0
");
return 0;
}