网易内推面试凉了,再战正式批笔试,选择和简答略难,编程题很良心,基本就是模拟、找规律,略加思考就能解出来的题目,本弱鸡只有在良心网易笔试才能AK。
1、翻转翻转
这题一开始没思路,ac了后两题后再回来思考,发现只需要判断某个位置周围有几个点,就代表了那个位置会被别的点翻转几次,那么如何求周围有几个点呢?
简单的把位置分成3类:
一类是四个顶点:每个顶点会被翻转4次(加上自己翻转一次)。
第二类是四条边(不含顶点):边上的点会被翻转6次。
第三类就是中间部分:中间的每个点会被翻转9次。
因此翻转9次的点就是我们需要的啦,求出中间部分的数量即可,再考虑只有一条边的时候,只有一个点的时候是特殊的,别的都是边长度 -2 。
(坑!数据量n,m是10^10,所以相乘的结果肯定比int大,要用long!然后2*(n+m-2)没用long转型也没过,小小的怀疑一下数据是不是比给的10^10范围还要大一点点)。
代码如下:
1 public static void main(String[] args) { 2 Scanner in = new Scanner(System.in); 3 while (in.hasNextInt()) {// 注意while处理多个case 4 int t = in.nextInt(); 5 while (t != 0) { 6 int n = in.nextInt(); 7 int m = in.nextInt(); 8 helper(n,m); 9 t--; 10 } 11 } 12 } 13 14 15 static void helper(int n,int m){ 16 if(m < n){ 17 int t = n; 18 n = m; 19 m = t; 20 } 21 if(n == 1 && m == 1){ 22 System.out.println(1); 23 }else if (n == 1) { 24 System.out.println(m-2); 25 }else { 26 long res = 1; 27 System.out.println(res*n*m-2*(n+m-2)); 28 } 29 }
2、买房
找规律:
最小可能就是所有人都挤在一起,不管怎么样都没有位置可以住,所以直接输出0,
最大可能分成两种情况:
已经住进去的人比房子数一半(实际是一半+1)小,那么就可以“#.#.#”这样排序,那么最大的可能数就是已经住进去的人数减1。
另一种情况,多出来的人会把可能的位置占掉,那么最多情况就是剩下的空位,因为每个位置都是可以住的。
上代码:
1 public static void main(String[] args) { 2 Scanner in = new Scanner(System.in); 3 while (in.hasNextInt()) {//注意while处理多个case 4 int t = in.nextInt(); 5 while(t!=0){ 6 int n = in.nextInt(); 7 int k = in.nextInt(); 8 int max = 0; 9 if(k >= 2 && n > k){ 10 if(k <= (n+1)/2){ 11 max = k-1; 12 }else { 13 max = n-k; 14 } 15 } 16 17 System.out.println(0 + " " + max); 18 t--; 19 } 20 } 21 }
3、倒香槟
想了几分钟没有特别好的解法,只能硬着头皮模拟,n,m的数据量有两个令我很疑惑,当时的想法就是做个模拟跑个20%的测试用例也够了,然后模拟完了之后发现过了!!
上代码:
public static void main(String[] args) { Scanner in = new Scanner(System.in); while (in.hasNextInt()) {//注意while处理多个case int n = in.nextInt();//n层 int m = in.nextInt();//m条指令 int[] array = new int[n+1]; int[] now = new int[n+1]; for(int i = 0;i<n;i++){ array[i+1] = in.nextInt(); } for(int j = 0;j<m;j++){ int inc = in.nextInt(); if(inc == 2){ int deepth = in.nextInt(); int num = in.nextInt(); add(deepth, num, array, now); }else if (inc == 1) { int deepth = in.nextInt(); System.out.println(now[deepth]); } } } } static void add(int n,int num,int[] array,int[] now){ int maxadd = 0; for(int i = n;i<array.length;i++){//每一层流下来 maxadd = array[i] - now[i]; if(maxadd >= num){//比当前层最多能容纳的少就直接倒进去,返回 now[i] += num; return; } now[i] = array[i]; num -= maxadd; } }