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); } }