java - For循环在Java中没有按预期继续?
问题描述
我正在尝试编写一个代码来反转同一数组中Java中增加的子数组(没有创建新数组)。例如,数组的输入items {2, 3, 4, 2, 1, 2, 3, 7, 8}
应该输出{4, 3, 2, 2, 8, 7, 3, 2, 1}
。到目前为止,我的代码正在反转第一个增加的子数组,但过去的元素似乎没有循环。
到目前为止,这是我的代码:
public static void reverse(int[] items)
{
int start = 0;
int count = 0;
for (int i = 1; i < items.length; i++)
{
if (items[i] > items[i-1])
{
if (count < 1)
{
start = i-1;
count ++;
}
else
{
count ++;
}
}
else
{
int j, k;
for (j = start; j < count/2; j++)
{
k = items[j];
items[j] = items[count - j];
items[count - j] = k;
j++;
}
count = 0;
}
}
output:
```{4, 3, 2, 2, 1, 2, 3, 7, 8}```
解决方案
您正在回顾与items[i]
比较items[i-1]
。但是,当它在最后一个索引处结束时,如何找到最后一个递增序列的结尾呢?这导致了错误。
可能解决了if (i != items.length - 1 && items[i] > items[i-1])
。
if (items[i] > items[i-1])
也可以消除then 部分,只在序列结束时响应 (items[i] <= items[i-1]`.
纯粹编码这个逻辑:
- 在位置
i
确定序列开始和结束 - 反向[开始..结束]。
结果是:
public static void reverse(int[] items) {
for (int i = 0; i < items.length; ++i) {
int start = i;
int end = i;
while (end + 1 < items.length && items[end + 1] > items[end]) {
++end;
}
i = end;
while (start < end) {
int temp = items[start];
items[start] = items[end];
items[end] = temp;
++start;
--end;
}
}
}
可以通过在 for 循环之前保存状态变量来消除第一个while
确定子序列的方法,但上述方法是最简单的。
代码行数从 17 LoC 减少到 12 LoC。
推荐阅读
- html - 将 Tinyletter 作为表单域嵌入到 Pelican 博客中
- ffmpeg - 从滚动视频中“展开”一张高大的图片
- java - 如果在参数中使用字符串列表(每个字符串项中有调用函数),如何编写 XML MyBatis 查询?
- java - 为什么观点不动?
- android-studio - ADB 拒绝 shell 命令 (logcat --help): 关闭
- flutter - 如何在 Flutter 中正确实现自定义字体?
- unity3d - 有没有办法让实例化的文本跟随游戏对象?
- postgresql - Gorm 一对一关系 2 个外键引用单向模型?
- javascript - 背景颜色没有通过使用 JS 更新 CSS 变量来更新
- sql - 在 oracle sql developer 中计算总计