如何按对角线对字符串中的字符进行排序
How to sort characters in a string diagonally
我正在按其长度的平方数拆分字符串..
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int a = alphabet.length();
int b = (int)Math.round(Math.sqrt(a));
System.out.println(java.util.Arrays.toString(splitter(key, b)));
// prints: [ABCDE, FGHIJ, KLMNO, PQRST, UVWXY, Z]
分割函数:
public static String[] splitter(String s, int len) {
return s.split(String.format("(?<=\G.{%1$d})", len));
}
我现在想要的是像这样对角排序:
[0] = {A,B,D,G,K}
[1] = {C,E,H,L,P}
[2] = {F,I,M,Q,U}
[3] = {J,N,R,V,Y}
[4] = {O,S,W,Z,0}
[5] = {T,X,0,0,0}
我试图通过一些循环来解决它,方法是始终检查 if (i-1) >= i... 但我感到困惑,有点迷失在这里..
不要先拆分再尝试在矩阵中排序。对数组进行排序,按对角线模式交叉矩阵,将排序后的项放入矩阵,合并字符串。
现在你所要做的就是找到一种对角迭代矩阵的方法。
我在下面创建的解决方案
- 计算结果矩阵的维度;
- 使用这些维度来初始化具有
NUL
个字符值的二维 result
数组;
- 根据同一对角线上的所有元素,它们的坐标之和是常数的想法设置数组中的值。
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
double root = Math.sqrt(alphabet.length());
int width = (int) Math.round(root);
int height = width < root ? width + 1 : width;
char[][] result = IntStream.range(0, height)
.mapToObj(i -> new char[width])
.toArray(i -> new char[height][]);
int x = 0, y = 0, sum = 0;
for (char c : alphabet.toCharArray()) {
result[x][y] = c;
y = x == Math.min(sum, height - 1) ? Math.min(++sum, width - 1) : y - 1;
x = sum - y;
}
System.out.println(Arrays.deepToString(result));
这会产生以下输出:
[[A, B, D, G, K], [C, E, H, L, P], [F, I, M, Q, U], [J, N, R, V, Y], [O, S, W, Z, ], [T, X, , , ]]
我正在按其长度的平方数拆分字符串..
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int a = alphabet.length();
int b = (int)Math.round(Math.sqrt(a));
System.out.println(java.util.Arrays.toString(splitter(key, b)));
// prints: [ABCDE, FGHIJ, KLMNO, PQRST, UVWXY, Z]
分割函数:
public static String[] splitter(String s, int len) {
return s.split(String.format("(?<=\G.{%1$d})", len));
}
我现在想要的是像这样对角排序:
[0] = {A,B,D,G,K}
[1] = {C,E,H,L,P}
[2] = {F,I,M,Q,U}
[3] = {J,N,R,V,Y}
[4] = {O,S,W,Z,0}
[5] = {T,X,0,0,0}
我试图通过一些循环来解决它,方法是始终检查 if (i-1) >= i... 但我感到困惑,有点迷失在这里..
不要先拆分再尝试在矩阵中排序。对数组进行排序,按对角线模式交叉矩阵,将排序后的项放入矩阵,合并字符串。
现在你所要做的就是找到一种对角迭代矩阵的方法。
我在下面创建的解决方案
- 计算结果矩阵的维度;
- 使用这些维度来初始化具有
NUL
个字符值的二维result
数组; - 根据同一对角线上的所有元素,它们的坐标之和是常数的想法设置数组中的值。
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
double root = Math.sqrt(alphabet.length());
int width = (int) Math.round(root);
int height = width < root ? width + 1 : width;
char[][] result = IntStream.range(0, height)
.mapToObj(i -> new char[width])
.toArray(i -> new char[height][]);
int x = 0, y = 0, sum = 0;
for (char c : alphabet.toCharArray()) {
result[x][y] = c;
y = x == Math.min(sum, height - 1) ? Math.min(++sum, width - 1) : y - 1;
x = sum - y;
}
System.out.println(Arrays.deepToString(result));
这会产生以下输出:
[[A, B, D, G, K], [C, E, H, L, P], [F, I, M, Q, U], [J, N, R, V, Y], [O, S, W, Z, ], [T, X, , , ]]