7.29-科大讯飞笔试

题型说明

16道计算机基础知识选择题

6道Java语言相关选择题

3道编程题

1.编程题一

破冰行动

一个企鹅站在一个冰桥(有多个格子组成)上,企鹅两边各敲一下,让冰破裂,使得企鹅掉到水中,求敲冰所用的最小的力,每格冰需要用的力不同。(企鹅不靠边)

翻译:一个数组,中间某个数,求左右两边最小的数,求其和。

 import java.util.*; public class Main{     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int[] A = new int[n];         int leftMin = Integer.MAX_VALUE;         int rightMin = Integer.MAX_VALUE;         int k = 0;         for (int i = 0; i < n; i++) {             A[i] = in.nextInt();             if (A[i] == -1) k = i;         }         for (int i = 0; i < k; i++) {             leftMin = Math.min(leftMin, A[i]);         }         for (int i = k + 1; i < n; i++) {             rightMin = Math.min(rightMin, A[i]);         }         System.out.println(leftMin + rightMin);     } }
 // 简化 import java.util.*; public class Main{     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int leftMin = Integer.MAX_VALUE;         int rightMin = Integer.MAX_VALUE;         int k = -1;         for (int i = 0; i < n; i++) {             int temp = in.nextInt();             if (A[i] == -1) {                 k = i;                 continue;             }             if (k == -1) {                 leftMin = Math.min(leftMin, temp);             } else {                 rightMin = Math.min(rightMin, temp);             }         }         System.out.println(leftMin + rightMin);     } }

2.编程题二

已知:两个数组A,B,求sum = abs(A[i] - B[i]) 绝对值差最小。

条件:可以任意次数操作两个数组,使得其中一个元素乘上-1。

思路:

最开始分析,每个数无分是如下4种情况:a - b、-a - b、a + b、-a + b。

进一步分析可以得出,最小的值为abs(abs(a) - abs(b))

由于题中给的元素大小范围是-10e9 ~ 10e9,结果要用long

 import java.util.*; public class Main{     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int[] A = new int[n];         int[] B = new int[n];         long res = 0;         for (int i = 0; i < n; i++) {             A[i] = in.nextInt();         }         for (int i = 0; i < n; i++) {             B[i] = in.nextInt();         }         for (int i = 0; i < n; i++) {             res += Math.abs(Math.abs(A[i]) - Math.abs(B[i]));         }         System.out.println(res);     } }

3.编程题三

已知:一个长度为n的"禁着点"数组A。

给出一个正整数数s,求x + y = s,x和y为正整数,所有的x和y的组合数,其中x和y不能为"禁着点"数组A中的数。

思路:

s可以拆分:(1, s - 1),(2, s - 2) ,... ,(i, s - i),(s - 1),总共res = s - 1种取值的可能。

故x可以取1 ~ (s-1)。同时需要再A数组中排出掉。

例:以A = {1, 2, 5, 10, 6, 11}, s = 10为例说明

x可以取1 ~ 9,在取x值时,y的值也相应的取为9 ~ 1了,故只用考虑x的取值。

当A数组中出现1 ~ 9时,例如:A数组出现2时,x取值不能为2了,由于对称关系,同时x也不能取8了,故res = res - 2,同时要用一个set记录8,防止后面出现8时重复去除了。

注意:s为奇数和偶数时略有差别。

例如:

  • s = 4,则取值情况为(1, 3),(2, 2) ,(3, 1),
  • s = 5,则取值情况为(1, 4),(2, 3) ,(3, 2),(4, 1)

可以看出当s为偶数时,只能取奇数中可能,故当中间的那个取值出现在数组A中时,只能去除一次,不能去除两次。故当s为偶数时,要求出中间的那个数值mid,要看mid是否出现在数组A中,出现则只能取除掉一种情况。

 import java.util.*; public class Main{     public static void main(String[] args) {         Scanner in = new Scanner(System.in);         int n = in.nextInt();         int[] A = new int[n];   // A不重复         int s = 0;         for (int i = 0; i < n; i++) {             A[i] = in.nextInt();         }         s = in.nextInt();         int res = s - 1;         Set<Integer> set = new HashSet<>();         int mid = s / 2;    // 4/2 = 2; 5/2 = 2         boolean midIsExist = false; // 记录中间值是否存在         for (int i = 0; i < n; i++) {             if (A[i] < s) {                 if (A[i] == mid) {                     midIsExist = true;                 }                 if (!set.contains(A[i])) {                     res -= 2;                     set.add(s - A[i]);                 }             }         }         // 是偶数时,中间那个数要去除,则res++,因为mid时去除了两次,应该只去除一次。         if (midIsExist && s % 2 == 0) {             res++;         }         System.out.println(res);     } }

全部评论
大佬,收到面试了吗
点赞 回复 分享
发布于 2023-08-10 15:49 四川

相关推荐

2024-12-04 19:53
已编辑
湖南文理学院 产品经理
牛客224543458号:他想找牛马,愿意疯狂加班的,因为要证明自己
点赞 评论 收藏
分享
评论
4
33
分享
牛客网
牛客企业服务