今晚字节的前端笔试题有人来聊聊嘛
感觉有点难啊……两个小时,这个时间是不是有点短啊……😥
我先放一下我写的……
小伙伴们,看到了来讨论一下吧
第一题
题目
如果用户A和B互动不少于3次,就认为A和B为豆油。如果A和B是豆油,B和C是豆油,那么A和C互为豆油。定义豆油瓶就是直系间接碰头组成的群体。
N*M的矩阵M,代表互动次数,如果M[i][j]=5,那么第i个和第j个用户互动过5次,为0表示没有互动。
对于i=j,同一个用户,互动次数,记成0,计算并输出所有豆油瓶的数目
比如输入
040
406
060
输出1
因为第一个和第二个用户互动超过3次,互为豆油,第二个和第三也互为豆油,所以1和3互为间接豆油,三个用户都在同一个豆油瓶里,返回1.
露珠的解法:
写的DFS。不过只通过了20%,写了我四十多分钟……结果20%,好尴尬……
//处理输入
let num=parseInt(readline());
let arr=[];//二维数组保存
for(let i=0;i<num;i++){
let temp=readline().split(' ');
arr[i]=new Array();
for(let j=0;j<temp.length;j++){
arr[i][j]=parseInt(temp[j]);
}
}
//输出
console.log(getBottleNum(arr));
//四个方向
var directions=[[1,0,-1,0],[0,1,0,-1]];
//获取豆油瓶的数目
function getBottleNum(arr){
if(!arr) return 0;//为空就没瓶
let ans=0;
let visited=[];//用来记录有没有被访问过
//处理一下visited
for(let i=0;i<arr.length;i++){
visited[i]=new Array();
for(let j=0;j<arr[0].length;j++){
visited[i][j]=false;
}
}
//执行
for(let i=0;i<arr.length;i++){
//调用一次dfs就搜索完一个区域,此时ans+1;
for(let j=0;j<arr[0].length;j++){
if(arr[i][j]<3&& visited[i][j]==false){
ans+=dfs(arr,visited,i,j);
}
}
}
return ans;
}
//DFS
function dfs(arr,visited,x,y){
if(x<0||x>=arr.length||y<0||y>=arr[0].length){return 0;}//不可以越界
let directions=[[1,0,-1,0],[0,1,0,-1]];//放外面还不能执行这啥IDE……
visited[x][y]=true;
for(let i=0;i<4;i++){
//上下左右遍历
let xx=x+directions[0][i];
let yy=y+directions[1][i];
if(xx>=0&&xx<arr.length&&yy>=0&&yy<arr[0].length&&visited[xx][yy]==false&&arr[xx][yy]<3){
visited[xx][yy]=true;
dfs(arr,visited,xx,yy);
}
}
return 1;
} 第二题
题目
原型花园有n个入口,修路,穿过花园。要求每个入口只能有一条路,所有的路都不会相交,求所有可行的方法总数。
额,就是卡特兰数
不知道哪里有问题,只通过了70%……有小伙伴AC了吗?求帮看看是哪里没有考虑到啊
//处理输入
let input=parseInt(readline());
console.log(getPathnum(input));
//C(2n,n)/n+1
function getPathnum(num){
let n=num/2;
let result=C(num,n)/(n+1);
return result%1000000007;
}
function C(x,n){
let ret=1;
for(let i=1;i<=n;i++){
ret=ret*(x-i+1)/i;
}
return ret;
} 第三题
题目
4*4数组实现 2048游戏,上下左右分开处理
合并的通用方法我也不太会写,有没有小伙伴写出来的,想看看你们的代码😥
第四题
题目
有很多糖果,每一个糖果的甜度记为a[n],如果i和j的甜度最大公约数>1,贼糖果i和j之间有桥梁连接
比如说20 50 22 74 9 63 输出4
因为20-50-22-74两两之间有公约数2,所以有边, 9-63最大公约数是3,与其他的数公约数是1,没有边
露珠的思路
我的想法是维护一个n*n的数组,记录下这个点能获取的最大糖果数目,然后依次放
思路有了,但是我写的不对…😂我算法太菜了
下面这个肯定是错的。。。枯了
想看看大佬们的代码咋写的……会有人发嘛……想看看
//处理输入
let num=readline();
let input=readline.split(' ');
let arr=input.map((item)=>{parseInt(item);});
console.log(getCandyNum(arr));
//来不及调试了,大致思路就是这样,维护一个二维数据,记录下这个点能获取的最大糖果数目
//然后取出最大的就好了orzzzzz
function getCandyNum(arr){
let status=[];//维护一个二维数组,记录
for(let i=0;i<arr.length;i++){
status[i]=new Array();
if(let j=0;j<arr.length;j++){
if(i==j){status[i][j]=1;}
if(GCD(arr[i],arr[j])>1){
status[i][j]=max(status[i][j-1],status[i-1][j])+1;
}
else{
status[i][j]=max(status[i][j-1],status[i-1][j]);
}
}
}
return Math.max(status)
}
//求两个数的最大公约数
function GCD(a,b){
let temp;
whilr(b!=0){
temp=a%b;
a=b;
b=temp;
}
return a;
}
字节跳动公司福利 1297人发布
