Java对角矩阵

3

我一直在想如何将一个字符串从左下角开始斜向包裹进矩阵中。 例如:

String str = "123456789";

//Output matrix:
//  479
//  258
//  136

//Or if str = "123456789123456";

//Output would be:

//  2
//  73
//  484
//  2595
//  13616

以下是我目前的翻译:

     int index = 0;
     for(int i = 0; i < matrix.length; i++)
     {
         for(int k = matrix.length - 1; k > -1; k--)
         {  
             if(index == word.length())
                 break;
             matrix[k][i] = "" + str.charAt(index);
             index++;
         }
     }

你能解释一下你是如何编写输出矩阵的吗?我不明白你想根据输入字符串得到什么样的输出矩阵。 - Karibasappa G C
3个回答

0

这里不对效率做任何声明,但只要您的字符串适合于一个方形矩阵,它应该可以工作:

static char[][] toDiag(String s)
{
    int sideLen = (int) Math.sqrt(s.length()); // assume string fits into
                                                // square matrix
    char[][] m = new char[sideLen][sideLen];
    int index = 0;
    //fill lower-left section of array
    for (int i = m[0].length - 1; i >= 0; i--)
    {
        for (int k = 0; k <= m[0].length-1-i; k++)
        {
            m[i+k][k] = s.charAt(index++);
        }
    }
    //fill upper-right section of array
    for (int i = sideLen%2==1?sideLen/2:sideLen/2 -1; i <= m[0].length; i++)
    {
        for (int k = 0; k <= m[0].length-1-i; k++)
        {
            m[k][i+k] = s.charAt(index++);
        }
    }
    return m;
}

0
public static void main(String[] args)
{
    String inString = "123456789";
    int N = (int) Math.sqrt((double) inString.length());
    int out[][] = new int[N][N];
    int index=0;

    //fills elements below the diagonal
    for(int i=0;i<N-1;i++)
        for(int j=0;j<=i;j++)
            out[N-1-i+j][j] = Character.getNumericValue(inString.charAt(index++));

    //fills the diagonal
    for(int i=0;i<N;i++)
        out[i][i] = Character.getNumericValue(inString.charAt(index++));

    //fills elements above the diagonal
    for(int i=N-2;i>=0;i--)
        for(int j=0;j<=i;j++)
            out[j][N-1-i+j] = Character.getNumericValue(inString.charAt(index++));

    //prints the output
    for(int i=0;i<N;i++)
    {
        for(int j=0;j<N;j++)
        {
            System.out.print(out[i][j] + "\t");
        }
        System.out.println();
    }
}

0

这是一个相对高效的实现,我认为它相对容易理解。

这段代码循环遍历连续的对角线,当当前位置在矩阵内部时,它会分配来自字符串的下一个字符。

在下面的图表中,问号位置在对角线上,但它们不在矩阵内。对于这些问号位置,不会从输入字符串中取出任何字符。

Diagonal  Matrix
   4      ?
   3      ??
   2      479
   1      258?
   0      136??

该循环按升序遍历行,但对每行的赋值是倒序进行的,因为从正常Java数组索引方式查看时,您的矩阵是上下颠倒的:使用matrix[size - row - 1]而不是matrix[row]

这种方式不需要对对角线以下、对角线和对角线以上进行特殊处理。

public static void main(String[] args) throws Exception {
    String str = "123456789";
    int size = 3;

    int[][] matrix = new int[size][size];
    {
        int index = 0;
        for (int diagonal = 0; diagonal < size * 2 - 1; diagonal++) {
            int row = diagonal;
            int column = 0;
            while (row >= 0) {
                if (row < size && column < size) {
                    matrix[size - row - 1][column] = Character.getNumericValue(str.charAt(index++));
                }
                row--;
                column++;
            }
        }
    }
}

它也适用于更大的矩阵(4x4、5x5等),但您只能在字符串中编码值高达9 - 如果您想要更高的值,最好将它们编码为逗号分隔的字符串,并将该字符串拆分为字符串数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接