1

给定一个二维字符串数组,我如何将所有元素相加,以便数组中的每个索引都是数组其余部分的总和?例如,[[a], [b], [c], [d], [e]]我最终得到一个数组
[[a+b+c+d+e], [a+b+c+d+e], [a+b+c+d+e], [a+b+c+d+e],[a+b+c+d+e]]。我想它不一定是二维数组,它可以是一维字符串数组,我最终在每个索引中都有一个字符串“a+b+c+d+e”。当我说循环时,我的意思是循环,没有额外的内存空间。所以也许在第一次迭代之后它可能看起来像[[a], [a + b], [a+b+c], [a+b+c+d], [a+b+c+d+e]]. 这样的代码是什么?答案可以是伪代码或任何语言

像这样:https ://andrew.gibiansky.com/blog/machine-learning/baidu-allreduce/

4

3 回答 3

1

我不太确定你想要实现什么。但是如果你看一下它可能是值得的Arrays#parallelPrefix,你可以用它来累积数组的单个元素。

public static void main(String[] args) {
    String[] str = {"a","b","c","d","e"};
    Arrays.parallelPrefix(str, (s1,s2) -> s1+s2);
    System.out.println(Arrays.toString(str));
}

//[a, ab, abc, abcd, abcde]
于 2020-05-03T11:11:35.723 回答
1

您可以通过将所有元素添加到其中一个项目然后将结果复制到其他项目来获取此类字符串。

    String[] arr = new String[] {"a", "b", "c", "d", "e"};

    for(int i = 1; i < arr.length; ++i) {
        arr[0] += arr[i];
    }
    for(int i = 1; i < arr.length; ++i) {
        arr[i] = arr[0];
    }       
    System.out.println(Arrays.toString(arr));
于 2020-05-03T11:17:27.957 回答
1

根据您附加的链接,我认为以下解决方案将对您有所帮助:

        int n = 5, i, j;
        String[][] gpu = new String[n][n];
        //here generate initial gpu....
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                char ch = (char) (97 + j);
                gpu[i][j] = ""+ch+i;
            }
        }
        System.out.println("Initial Gpu: ");
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(gpu[i][j] + "|");
            }
            System.out.println();
        }
        // here calculated your expected logic
        for (i = 0; i < n-1; i++) {
            for (j = 0; j < n; j++) {
                gpu[(i+j+1)%n][j] = gpu[(i+j)%n][j] + gpu[(i+j+1)%n][j];
            }
        }
        System.out.println("Final Gpu: ");
        for (i = 0; i < n; i++) {
            System.out.print(gpu[n-1][i] + "|");
        }
        System.out.println();
于 2020-05-03T12:15:28.153 回答