java - 计算最长连败的总损失
问题描述
一个连续的数字序列,其中每个数字小于等于前一个数字,称为连败。连胜的最后一个数字和第一个数字之间的价值差异称为损失。
例如,如果在标准输出中提供了这些数字:
3, 6, 36, 32, 32, 121, 66, 24, 22, 371, 661, 6, 4, 8.
序列中最长的连续是36,32,32
and121,66,24,22
和661,6,4
,相应的损失是 4 和 99 和 657。在这种情况下,具有 4 个数字的 2nd Streak 是最长的。所以程序应该将输出打印为 99。
我尝试使用以下程序但无法正确处理:
public class LoosingStreak {
public static void main(String[] args) {
int arr [] = {3, 6, 36, 32, 32, 121, 66, 24, 22, 371, 661, 6, 4, 8, -1};
int temp [] = new int[arr.length];
processArray(arr);
}
static int processArray(int [] arr) {
int temp [] = new int[arr.length];
int len = arr.length;
for(int i=0; i<len-1; i++) {
if(arr[i+1] <= arr[i]) {
temp[i] = arr[i];
System.out.println(temp[i]);
}
}
return -1;
}
}
输出是:36, 32, 121, 66, 24, 661, 6, 8
这是不正确的。我该如何解决这个问题?
解决方案
您需要跟踪当前最长的条纹,以及此长度条纹的当前最大损失。如果你发现一个比最大值更长的连续,更新最长的连续和最大损失。如果您发现一条与当前最长的长度相同的条纹,则更新最大损失(如果它更大)。
static int processArray(int [] arr)
{
int longestStreak = 0;
int maxLoss = 0;
for(int j=0, i=1; i<=arr.length; i++)
{
if(i == arr.length || arr[i] > arr[i-1])
{
int streak = i - j;
if(streak > 1 && streak >= longestStreak)
{
int loss = arr[j] - arr[i-1];
if(streak > longestStreak)
{
longestStreak = i-j;
maxLoss = loss;
}
else if (loss > maxLoss)
maxLoss = loss;
}
j = i;
}
}
return longestStreak > 0 ? maxLoss : -1;
}
请注意,我的连续数字由小于或等于前一个数字的连续数字组成,因此单例不会是连续数字。
测试:
int test[][] = {{1},
{1, 1},
{1, 2, 3},
{3, 2, 1},
{3, 2, 1, 4, 2, 1},
{3, 6, 36, 32, 32, 121, 66, 24, 22, 371, 661, 6, 4, 8, -1}};
for(int[] arr : test)
System.out.format("%s : %d%n", Arrays.toString(arr), processArray(arr));
输出:
[1] : -1
[1, 1] : 0
[1, 2, 3] : -1
[3, 2, 1] : 2
[3, 2, 1, 4, 2, 1] : 3
[3, 6, 36, 32, 32, 121, 66, 24, 22, 371, 661, 6, 4, 8, -1] : 99
推荐阅读
- java - 使用特定值计算税金
- c# - ACE 驱动程序在 VBA 中工作,但在 C# 中不工作 - 为什么?
- python - 为表达式索引错误的字符
- entity-framework-core - 尽管填充了值,但基于 Not Null 约束的异常
- api - 如何在 Swagger 中定义不同的模式
- html - VueJs v-for 渲染 div 但不渲染表格行?
- c# - 将 DayTime 分配给变量
- opengl-es-2.0 - 在 OpenGL ES 2 2D 中剔除屏幕外对象
- sql - 如何从 R.Data 向 SQLite 数据库插入值?
- python - __getitem__ 和 __len__ 属于哪个模块?