Java代码解析:求解数组的小和问题

news/2024/12/31 4:07:42/

在这篇博客中,我们将深入探讨如何使用Java解决一个有趣的问题:求解数组的小和问题。我们将首先理解问题的定义,然后逐步分析和解释给出的Java代码。

问题定义

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。例如,数组[1,3,4,2,5]的小和为1+1+3+1+1+3+2=12。

代码解析

首先,我们定义了一个类 Code02_SmallSum ,该类包含了一系列的方法,用于求解数组的小和。以下是我们将要讨论的主要方法:

smallSum方法

public static int smallSum(int[] arr) {if (arr == null || arr.length < 2) {return 0;}return process(arr, 0, arr.length - 1);
}

smallSum 方法是我们的主要方法,它接收一个整数数组作为输入,如果数组为空或者长度小于2,那么直接返回0,否则调用 process 方法进行处理。

process方法

public static int process(int[] arr, int l, int r) {if (l == r) {return 0;}// l < rint mid = l + ((r - l) >> 1);returnprocess(arr, l, mid)+process(arr, mid + 1, r)+merge(arr, l, mid, r);
}

process 方法是一个递归方法,它接收一个整数数组和两个索引 lr 作为输入,表示要处理的数组范围。首先,如果 l 等于 r ,那么直接返回0。然后,计算中间索引 mid ,并递归地处理左半部分和右半部分,最后将两个部分合并。

merge方法

public static int merge(int[] arr, int L, int m, int r) {int[] help = new int[r - L + 1];int i = 0;int p1 = L;int p2 = m + 1;int res = 0;while (p1 <= m && p2 <= r) {res += arr[p1] < arr[p2] ? (r - p2 + 1) * arr[p1] : 0;help[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];}while (p1 <= m) {help[i++] = arr[p1++];}while (p2 <= r) {help[i++] = arr[p2++];}for (i = 0; i < help.length; i++) {arr[L + i] = help[i];}return res;
}

merge 方法是用于合并两个部分的,它接收一个整数数组和三个索引 Lmr 作为输入,表示要合并的数组范围和中间索引。这个方法的主要思想是使用两个指针 p1p2 ,分别指向左半部分的开始和右半部分的开始。然后,比较两个指针指向的元素,如果 p1 指向的元素小于 p2 指向的元素,那么将 p1 指向的元素加入到结果中,并向右移动 p1 ,否则将 p2 指向的元素加入到结果中,并向右移动 p2 。这个过程一直持续到 p1p2 到达各自的部分的末尾。

测试代码

// for testpublic static int comparator(int[] arr) {if (arr == null || arr.length < 2) {return 0;}int res = 0;for (int i = 1; i < arr.length; i++) {for (int j = 0; j < i; j++) {res += arr[j] < arr[i] ? arr[j] : 0;}}return res;}// for testpublic static int[] generateRandomArray(int maxSize, int maxValue) {int[] arr = new int[(int) ((maxSize + 1) * Math.random())];for (int i = 0; i < arr.length; i++) {arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());}return arr;}// for testpublic static int[] copyArray(int[] arr) {if (arr == null) {return null;}int[] res = new int[arr.length];for (int i = 0; i < arr.length; i++) {res[i] = arr[i];}return res;}// for testpublic static boolean isEqual(int[] arr1, int[] arr2) {if ((arr1 == null && arr2 != null) || (arr1 != null && arr2 == null)) {return false;}if (arr1 == null && arr2 == null) {return true;}if (arr1.length != arr2.length) {return false;}for (int i = 0; i < arr1.length; i++) {if (arr1[i] != arr2[i]) {return false;}}return true;}// for testpublic static void printArray(int[] arr) {if (arr == null) {return;}for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}// for testpublic static void main(String[] args) {int testTime = 500000;int maxSize = 100;int maxValue = 100;boolean succeed = true;for (int i = 0; i < testTime; i++) {int[] arr1 = generateRandomArray(maxSize, maxValue);int[] arr2 = copyArray(arr1);if (smallSum(arr1) != comparator(arr2)) {succeed = false;printArray(arr1);printArray(arr2);break;}}System.out.println(succeed ? "Nice!" : "Fucking fucked!");}

main 方法中,我们生成了一些随机数组,并使用 smallSum 方法和一个简单的比较方法 comparator 进行了测试,以验证我们的解决方案是否正确。

总结

以上就是我们对求解数组的小和问题的Java代码的解析。希望这篇博客能够帮助你理解和掌握这个问题的解决方案。如果你有任何问题或者建议,欢迎在下面的评论区留言。


http://www.ppmy.cn/news/837354.html

相关文章

云深处绝影四足机器人协议学习解析

绝影四足机器人通信协议学习解析 本学习文档介绍了云深处 绝影X20 四足机器人的通信协议&#xff0c;并对相关的通信机制和命令格式进行了简单的解析。该协议在机器人系统和上位机&#xff08;例如外部板卡或系统&#xff09;之间进行TCP通信时使用。 1. 协议端口号 在此协议…

cpu高对计算机有什么影响吗,电脑CPU性能高低有什么影响 怎么提高电脑CPU性能...

CPU是电脑主机的三大核心之一,一台电脑的好坏关键就要看CPU的强度了,有一台好的CPU电脑的运行速度、优化能力都非常好,很多小伙伴或许不知道CPU的重要性,下面让我们一起了解下CPU性能的高低对电脑的影响吧! 电脑CPU性能高低有什么影响: 一、一般而言频率高性能比较好 1、C…

CPU计算机性能的操作方法,把电脑CPU性能调到最大的三种方法

把电脑CPU性能调到最大的三种方法 如果把电脑比作人,CPU就是的大脑,其主要功能是对系统操作指令进行算术和逻辑运算。把电脑CPU性能调到最大&#xff0c;能使系统运行速度变快。今天dengb.com小编带来了三种解决方法&#xff0c;具体的教程下面一起来看看吧。 方法一&#xff1…

ubuntu 调整cpu运行模式至高性能

ubuntu下cpu默认运行在节能模式下,会比较慢&#xff0c;通过如下方式进行调整 1、安装cpufrequtils: sudo apt-get install cpufrequtils 2、查看当前cpu的状态&#xff1a; cpufreq-info 3、把cpu调整到性能模式&#xff1a; sudo cpufreq-set -g performance …

计算机cpu性能过剩吗,都说CPU性能过剩,为什么电脑还有卡顿的情况?原来是它在拖后腿!...

原标题&#xff1a;都说CPU性能过剩&#xff0c;为什么电脑还有卡顿的情况&#xff1f;原来是它在拖后腿&#xff01; 这个世界真的是很矛盾&#xff0c;一边有人说CPU性能不足&#xff0c;另一边又有人说CPU性能过剩。 那么&#xff0c;哪一种说法才是正确的呢&#xff1f; 如…

1.6 CPU性能公式

CPU时间 一个程序在CPU上运行的时间&#xff0c;不包括 I/O 时间 时钟周期 系统的时间周期越短&#xff0c;相应的CPU性能就越好 程序的时钟周期数 CPU时间 执行程序所需的时钟周期数 X 时钟周期时间 时钟周期时间是时钟频率的倒数 指令周期数 CPI 平均每条指令耗费的…

计算机发挥cpu全部,怎样提升CPU性能?怎么让CPU发挥最大的性能

CPU&#xff1a;中央处理器(CPU&#xff0c;英语&#xff1a;Central Processing Unit)&#xff0c;是电子计算机的主要设备之一&#xff0c;电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。电脑中所有操作都由CPU负责读取指令&#xff0c;对指令译…

macOS Ventura 13.5beta5(22G5072a)发布

系统介绍 黑果魏叔 7 月 11 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 5 更新&#xff08;内部版本号&#xff1a;22G5072a&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、Fa…