【问题标题】:Finding the column total in an array查找数组中的列总计
【发布时间】:2013-05-21 11:54:38
【问题描述】:

我有一个包含随机元素的一维数组,通过 m*n 网格获得。我想找出其中存在的行总数和列总数。

这里是一维数组的样子: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]

我想这样对待它:

0102030405

0607080910

1112131415

1617181920

现在我想找到 reo 总计和列总计。 行合计如下:

for (int i = 0; i < totalRows; i++)
        {
            for (int j = 0; j < totalColumns; j++)
            {
                rowTotal[i] += numbers[temp + j];
            }               
            temp += totalColumns;
        }

我正在尝试对 Column 做同样的事情。 代码如下:

for (int i = 0; i < totalColumns; i++)
        {
            tempk = 0;

            for (int j = 0; j < totalRows; j++)
            {
                blockTotal[i] += numbers[i+j+tempk];
               tempk += totalColumns;

            }
        }

无法按预期获得列总数。请帮忙。

【问题讨论】:

  • 为什么不使用多维数组呢?
  • 你应该能够通过使用第一个循环得到你的结果,并将rowTotal[i] +=替换为columnTotal[j] +=

标签: c# java c++ arrays grid


【解决方案1】:

你可以在同一个循环中获得两者

for (int i = 0; i < totalRows; i++)
{
    for (int j = 0; j < totalColumns; j++)
    {
        rowTotal[i] += numbers[i * totalColumns + j];
        blockTotal[j] += numbers[i * totalColumns + j];
    }            
}

【讨论】:

  • 此代码仅适用于 MM 矩阵。不适用于 MN。如何修改此代码,使其适用于 M*N?
【解决方案2】:

最简单的做法是编写一个将“逻辑”(行、列)地址转换为索引的小方法:

int numberAt(int row, int col)
{
    return numbers[row * totalColumns + col];
}

int[] colTotals = new int[totalColumns];
int[] rowTotals = new int[totalRows];

for (int row = 0; row < totalRows; ++row)
{
    for (int col = 0; col < totalColumns; ++col)
    {
        int number = numberAt(row, col);
        rowTotals[row] += number; 
        colTotals[col] += number;
    }
}

针对以下 cmets 中的问题进行编辑:

这是一个完整的可编译示例,展示了它在非方形数组上的工作:

using System;
using System.Collections.Generic;
using System.Linq;

namespace Demo
{
    class Program
    {
        // Array will 4x3 (rows x cols):
        //
        //  1  2  3 |  6
        //  4  5  6 | 15
        //  7  8  9 | 24
        // 10 11 12 | 33
        // ---------
        // 22 26 30

        int[] numbers = Enumerable.Range(1, 12).ToArray();
        int totalColumns = 3;
        int totalRows    = 4;

        int numberAt(int row, int col)
        {
            return numbers[row * totalColumns + col];
        }

        void test()
        {
            int[] colTotals = new int[totalColumns];
            int[] rowTotals = new int[totalRows];

            for (int row = 0; row < totalRows; ++row)
            {
                for (int col = 0; col < totalColumns; ++col)
                {
                    int number = numberAt(row, col);
                    rowTotals[row] += number;
                    colTotals[col] += number;
                }
            }

            Console.WriteLine("Row totals");

            foreach (int rowTotal in rowTotals)
                Console.Write(rowTotal + " ");

            Console.WriteLine("\nCol totals");

            foreach (int colTotal in colTotals)
                Console.Write(colTotal + " ");

            Console.WriteLine();
        }

        static void Main()
        {
            new Program().test();
        }
    }
}

【讨论】:

  • 此代码仅适用于 MM 矩阵。不适用于 MN。如何修改此代码,使其适用于 M*N?
  • @Vivek 它确实适用于 M*N - 我已将示例代码添加到我的答案中以进行演示。
【解决方案3】:

按行总计

for(int r = 0; r < totalRows; r++)
{
  for(int c = 0; c < totalColumns; c++)
  {
    rowTotal[r] += numbers[r * totalColumns + c];
  }
}

按列总计

for(int c = 0; c < totalColumns; c++)
{
  for(int r = 0; r < totalRows; r++)
  {
    colTotal[c] += numbers[r * totalColumns + c];
  }
}

【讨论】:

  • 应该是r * totalColumns + c,而不是r * totalColumns + totalColumns
  • 此代码仅适用于 MM 矩阵。不适用于 MN。如何修改此代码,使其适用于 M*N?
  • M -> totalRows, N -> totalColumns
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2017-04-04
  • 2022-01-02
  • 2020-09-29
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多