我已经实现了一个函数TraverseStringClockwise,它采用逗号分隔的整数字符串,宽度和高度,并通过使用2D字符数组以顺时针顺序行走来返回一个新字符串。我试图使用一维数组做同样的事情,但我遇到了问题。
示例:
海峡=” 1,2,3,4,5,6,7,8,9,10,11,12” ;宽度= 3;高度= 4; Returnstr =” 1,2,3,6, 9,12,11,10,7,4,5,8”
任何指针/帮助?
这是代码
公共类TraverseStringClockwise {
// Build 2-dimensional matrix representing h * w
public static String[][] buildMatrix(String[] s, int width, int height)
{
String[][] matrix = new String[height][width];
int charPos = 0;
for(int i = 0; i < height; i++)
{
for(int j = 0; j < width; j++)
{
matrix[i][j] = s[charPos++];
}
}
return matrix;
}
public static String traverseStringClockwise(String s, int width, int height)
{
// invalid if width or height are zero or there aren't enough elems in String to fill the matrix
if(s == null || width == 0 || height == 0 || (s.split(",").length != width * height) )
{
return null;
}
String[][] matrix = buildMatrix(s.split(","), width, height); // O(n) where n = w*h
Cursor cursor = new Cursor(width, height);
StringBuilder sb = new StringBuilder();
while(!cursor.isWalkComplete()) // // O(n) where n = w*h
{
cursor.walk();
sb.append(matrix[cursor.colPos][cursor.rowPos]);
if(!cursor.isWalkComplete())
{
sb.append(",");
}
}
return (sb.length() > 1) ? sb.toString() : null;
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String input = "1,2,3,4,5,6,7,8,9,10,11,12";
int width = 3, height = 4;
String[][] block = buildMatrix(input.split(","), 3, 4);
System.out.println("INPUT = " + input);
System.out.println("OUTPUT = " + walkStringClockwise(input, width, height));
}
}
答案 0 :(得分:2)
如果您已经拥有在2D数组中按顺时针顺序遍历数组的代码,则可以使用标准技巧将此代码转换为仅使用1D数组,方法是将2D数组线性化为1D数组。一种方法是将2D阵列以行主顺序存储为一维阵列。例如,给定这个2D数组:
1 2 3
4 5 6
7 8 9
10 11 12
您可以将其编码为1D数组
1 2 3 4 5 6 7 8 9 10 11 12
也就是说,你布置第一行的所有元素,然后是第二行的所有元素,然后是第三行的所有元素,等等。
这种方法的优点是,如果给原始2D数组中的索引(row,col),您可以有效地找到1D数组中的匹配位置。要了解如何执行此操作,请注意您在原始数组中采用的每个水平步骤对应于1D数组中的水平步骤,而您在原始数组中采用的每个垂直步骤对应于跳过1D数组中的一行元素。总的来说,公式是2D数组中的(row,col)元素可以在1D数组中的位置行* width + col找到。
鉴于此,您可以尝试重写代码以仅使用一维数组,将使用二维数组的所有实例替换为相应的代码,以便如上所述访问一维数组中的正确元素。
希望这有帮助!