我有一个字符的2D矩阵,并且无法在Spirally中搜索矩阵

时间:2016-11-06 07:33:01

标签: java matrix

我从左下角开始,顺时针方向前进,直到没有留下字符。这是我的代码。

        import java.io.*;
        import java.util.*;

public class Solution {
    static int count = 0;

 public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int m = sc.nextInt();
    int n = sc.nextInt();

    char[][] matrix = new char[n][m];
    char[] temp = new char[n*m];
    for(int r=0;r<n;r++){
        for(int col=0;col<m;col++){
            matrix[r][col] = sc.next().charAt(col);
        }
    }
    int k=0, l = 0;


    while(k < n && l < m){
        if(l<m){
            for(int i = n-1;i>=k;i--){
                temp[count] = matrix[i][l];
                count++;
            }
            l++;
        }

        for(int i = l;i<m;i++){
            temp[count]  = matrix[k][i];
            count++;
        }
        k++;

        for(int i = k;i<n;i++){
            temp[count] = matrix[i][m-1];
            count++;
        }
        m--;

        if(k < n){
            for(int i = m-1;i>=l;i--){
                temp[count] = matrix[n-1][i];
            }
            n--;
        }
    }


    String code = String.valueOf(temp);
    String[] dec = code.split("#");
    //System.out.println(dec);
    int count2 = dec.length;
    System.out.println(count2);
  }
 }

那么有谁可以指出我哪里出错了?我从左下角开始,向上爬,向右走,然后往下走,向左走,继续直到没有元素离开。

2 个答案:

答案 0 :(得分:0)

有两个问题:输入错误和计数器增量丢失。

输入错误:

for(int r=0;r<n;r++){
    for(int col=0;col<m;col++){
        // The following reads a new line each time a new character is needed
        matrix[r][col] = sc.next().charAt(col);
    }
}

这可以通过从内循环中提升sc.next()来解决:

for (int r = 0; r < n; r++) {
    String line = sc.next();
    for (int col = 0; col < m; col++) {
        matrix[r][col] = line.charAt(col);
    }
}

或(优选)完全去除内环:

for (int r = 0; r < n; r++) {
    matrix[r] = sc.next().toCharArray();
}

缺少增量(螺旋的下半部分):

for(int i = m-1;i>=l;i--){
    temp[count] = matrix[n-1][i];
    // Counter increment is missing. Add
    // counter++;
}

通常,最好使用StringBuilder来逐步构造字符串。在您的情况下,它将如下所示:

StringBuilder temp = new StringBuilder();
<...>
temp.append(matrix[n-1][i]);
<...>
String code = temp.toString();

在此代码中,您不必估算可能的字符串大小,也不必手动跟踪当前插入位置。

答案 1 :(得分:0)

从矩阵的左下角开始是

    matrix[0][m];
通过将m减少到已经插入了char的点来上升。 我会在while循环中使用4 for循环,如下所示:

    while (usedRow < (int)0.5*n && usedCol < (int)0.5*m)
    {
         //usedRow and usedCol start with the value of 0 and will be raised
         // by the end of the loop
         int i, j;
         for (i = m - usedCol; i<=(m-usedCol); i++)
          { 
              matrix[usedRow][m-i] = sc.next().charAt(0);
          }
          for (j = usedRow; j <= (n-usedRow); j++)
          {
              matrix[n + j][usedCol] = sc.next.charAt(0);
          }
          for (i = usedCol; i <= (m-usedCol); i++)
          {
              matrix [n - usedRow][m+i] = sc.next().chatAt(0);
          }
          for ( j = n - usedRow; j <= (n - usedRow); j++)
          {
              matrix[n - j][m - usedCol] = sc.next().charAt(0);
          }
          usedRow++;
          usedCol++;
    }

这样你顺时针方向并将循环保持在未使用的行和列中。

希望它在某种程度上帮助了你。