Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java对角矩阵_Java_Matrix - Fatal编程技术网

Java对角矩阵

Java对角矩阵,java,matrix,Java,Matrix,我一直在想,如何从左下角将一个字符串对角包装成一个矩阵。 例如: 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;

我一直在想,如何从左下角将一个字符串对角包装成一个矩阵。 例如:

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++;
         }
     }
int索引=0;
对于(int i=0;i-1;k--)
{  
if(index==word.length())
打破
矩阵[k][i]=“”+str.charAt(索引);
索引++;
}
}

这里没有关于效率的任何声明,但只要你的字符串符合正方形矩阵,它就应该有效:

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;
}
static char[]toDiag(字符串s)
{
int sideLen=(int)Math.sqrt(s.length());//假设字符串适合
//方阵
char[][]m=新的char[sideLen][sideLen];
int指数=0;
//填充数组的左下部分
对于(int i=m[0]。长度-1;i>=0;i--)
{
对于(int k=0;k
publicstaticvoidmain(String[]args)
{
字符串inString=“123456789”;
int N=(int)Math.sqrt((double)inString.length());
int out[][]=新的int[N][N];
int指数=0;
//填充对角线下方的元素

对于(inti=0;i,这是一个相当有效的实现,我相信它相对容易理解

该代码在连续的对角线上循环,当当前位置在矩阵中时,它将从字符串中指定下一个字符

在下表中,问号位置位于对角线上,但不在矩阵内。这些问号位置的输入字符串中没有字符

对角矩阵
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++;
            }
        }
    }
}
publicstaticvoidmain(字符串[]args)引发异常{
字符串str=“123456789”;
int size=3;
int[][]矩阵=新的int[size][size];
{
int指数=0;
对于(int diagonal=0;diagonal=0){
if(行<大小&列<大小){
矩阵[size-row-1][column]=Character.getNumericValue(str.charAt(index++));
}
行--;
列++;
}
}
}
}

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

您可以解释一下,您是如何编写输出矩阵的,我不知道您希望如何根据输入字符串获得输出矩阵。。
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++;
            }
        }
    }
}