【问题标题】:How to move columns whose sum is negative to the end?如何将总和为负的列移动到最后?
【发布时间】:2021-12-30 17:59:14
【问题描述】:

例如:我有一个数组:

int[][] arr = {{-3,1,-5,2,-1},
               {-3,1,-5,2,-2},
               {-3,1,-5,2,-3}};

我需要得到这样一个数组:

int[][] arr = {{1,2,-3,-5,-1},
               {1,2,-3,-5,-2},
               {1,2,-3,-5,-3}};

我希望程序对任何双数组都是通用的。


有什么想法吗?

【问题讨论】:

  • 从第 0 列开始,计算列的总和。如果小于 0,则在右侧找到一个总和为正的列。交换两列。移动到第 1 列并执行相同的操作,直到到达最后一列。
  • 你关心正值的顺序吗?如果您可以使用自然顺序 (2,1,-1,-3,-5) 而不是 1,2,-3,-5,-1,会容易得多。
  • 破坏你自己的帖子(比如用垃圾代替他们的标题或内容)是违反这里的规则的。
  • 请不要通过破坏您的帖子为他人增加工作量。通过在 Stack Exchange 网络上发帖,您已在 CC BY-SA 4.0 license 下授予 Stack Exchange 分发该内容的不可撤销的权利(即无论您未来的选择如何)。根据 Stack Exchange 政策,帖子的非破坏版本是分发的版本。因此,任何破坏行为都将被撤销。如果您想了解更多关于删除帖子的信息,请参阅:How does deleting work?

标签: java multidimensional-array


【解决方案1】:

这是一种方法。这仅适用于矩形数组,因为如果任何正求和列短于负求和列,则无法保持列对齐。

int[][] arr = { { -3, 1, -5, 2, -1 },
                { -3, 1, -5, 2, -2 },
                { -3, 1, -5, 2, -3 } };

首先创建一个列总和数组。

int[] colsum = new int[arr[0].length];

for (int col = 0; col < arr[0].length; col++) {
    for (int row = 0; row < arr.length; row++) {
           colsum[col] += arr[row][col];
    }       
}

然后,创建一个结果数组以根据列总和复制列。 为了保持相同有符号列的相对列顺序,使用了两个循环。第一个是从右到左。第二个是从左到右,但一旦到达先前添加的负列,也会停止。

int[][] result = new int[arr.length][arr[0].length];

int rearLoc = arr[0].length-1;
int forwardLoc = 0;
for (int col = arr[0].length-1; col >= 0; col--) {
    if (colsum[col] < 0) {
         for (int row = 0; row < arr.length; row++) {
               result[row][rearLoc] = arr[row][col];
         }
         rearLoc--;
    }
}
for (int col = 0;  forwardLoc <= rearLoc && col < arr[0].length; col++) {
    if (colsum[col] >= 0) {
        for (int row = 0; row < arr.length; row++) {
            result[row][forwardLoc] = arr[row][col];
        }
        forwardLoc++;
    }
}
for (int[] a : result) {
    System.out.println(Arrays.toString(a));
}

打印

[1, 2, -3, -5, -1]
[1, 2, -3, -5, -2]
[1, 2, -3, -5, -3]

【讨论】:

  • 是的,它正在工作,但是有没有办法让负数序列看起来像我在示例中的序列?就像原来的负数序列应该被保留,但是这里它改变了
  • 我修改了我的答案和解释。我不得不使用两个循环,首先是从右到左,然后从左到右。第二个循环并不总是必须遍历整个源数组。
  • 如果我在数组中再添加一列 3,3,3,程序输出 3 个零而不是 3 个三,但它仍然有效。我该如何解决这个问题?
  • 我很抱歉。当我更新我的答案时,我犯了一个愚蠢的错误。在第二个外循环中,将col &lt; arr[0].length-1 更改为col &lt; arr[0].length。它以前有效,因为最后一列中没有正和,所以循环不需要到达它。
  • 哈哈,谢谢,我真的很想写这个,我想不出如何更改 arr[0].length-1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-06-28
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2010-09-24
相关资源
最近更新 更多