360笔试 编程题 100 55
第一道 ac 求表面积
按行遍历,找出每块的左右暴露面积(前块高减后块高)
按列遍历,找出每块的前后暴露面积(同上)
上下面积为M*N*2
代码不放了
第二道 数字排列
按行遍历,找出每块的左右暴露面积(前块高减后块高)
按列遍历,找出每块的前后暴露面积(同上)
上下面积为M*N*2
代码不放了
第二道 数字排列
用一两个M大小数组分别存入两数的值
结果从左到右遍历,每位上都找最大的取模值
取模查找方式:若找模为k的两数字,一个为i,另一即为((k M)- i)%M,通过上面的俩数组很好查找
import java.util.*;
public class Main {
public static void main(String[] arg){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int M = in.nextInt();
int[] a=new int[N];
int[] b=new int[N];
int[] ma = new int[M];
int[] mb = new int[M];
for(int j=0;j<N;j ){
a[j] = in.nextInt();
ma[ a[j] ] ;
}
for(int j=0;j<N;j ){
b[j] = in.nextInt();
mb[ b[j] ] ;
}
int[] re = new int[N];
int flag = M-1;
for(int k=0;k<N;k ){
flag= fun(ma,mb,M,N,flag);
re[k] = flag;
}
for(int i=0;i<M-1;i ){
System.out.print(re[i] " ");
}
System.out.print(re[M-1]);
}
public static int fun(int[] ma,int[] mb,int M,int N,int flag){
// flag[0] = M-1
for(int k=flag;k>=0;k--){
for(int i=0;i<M;i ){
int s = ((k M)-i)%M;
if(ma[i]>0 && mb[ s]>0){
ma[i]--;mb[s]--;
return k;
}
}
}
return -1;
}
}
最后一分钟提交,过了55%,有没有大佬有最优方案?
#360公司##笔试题目#