目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。
- 专栏福利:限时订阅49.9,订阅后可加入华为OD刷题群,获得哪吒优先答疑机会(华为OD刷题指导,远程代码调试),群里大佬众多可以抱团取暖,群友刷题经验分享,考试经验分享。
一、题目描述
给定一个由若干个整数组成的数组nums,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组),分别对子数组求和得到两个值,计算这两个值得差值,请输出所有分割方案中,差值最大的值。
二、输入描述
第一行输入数组中的元素个数n,1 < n <= 100000
第二行输入数字序列,以空格进行分割,数字取值为4字节整数。
三、输出描述
输出差值的最大取值。
四、解题思路
在数组内的任意位置进行分割,左右两边各若干个数,再对两遍的数进行求和,求出差值的最大值。
差值的最大值,应该是大数减小数,是一个正数,故取差值的绝对值。
这道题相对来说还是比较简单的,三分钟拿下?
- 输入数组中的元素个数n;
- 输入数字序列,以空格进行分割;
- 定义左边之和leftSum,初始化为0;
- 定义右边之和rightSum,并初始化为当前数组之和;
- 定义变量差值的最大取值max;
- 使用暴力算法,计算左右两边数组的差值;
- 取最大差值;
- 输出差值的最大取值;
五、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 数组中的元素个数n
int n = Integer.parseInt(sc.nextLine());
// 数字序列,以空格进行分割
int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 左边之和
long leftSum = 0;
// 右边之和
long rightSum = Arrays.stream(nums).sum();
// 差值的最大取值
long max = 0;
// 暴力算法
for (int i = 0; i < n - 1; i++) {
leftSum += nums[i];
rightSum -= nums[i];
// 计算左右两边数组的差值
long diff = Math.abs(leftSum - rightSum);
// 取最大差值
if (diff > max) {
max = diff;
}
}
// 输出差值的最大取值
System.out.println(max);
}
六、效果展示
1、输入
5
5 7 2 3 10
2、输出
17
3、说明
将数组5 7 2 3 10两边分割成两个数组,通过暴力算法求出差值的最大取值。
- 5 -(7 + 2 + 3 +10) = 17;
- (5+7)-(2 + 3 + 10) = 3;
- (5+7+2)-(3+10)=1;
- (5+7+2+3)-10=7;
哪个最大,一目了然!
输出差值的最大取值17。
🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。