Это решение имеет хорошую симметрию.
public static String transpose(String s) {
StringBuilder sb = new StringBuilder();
sb.setLength(s.length());
for (int i = 0, j = s.length() - 1, x = 0; i <= j; ) {
sb.setCharAt(x++, s.charAt(i++));
if (i > j) break;
sb.setCharAt(x++, s.charAt(j--));
}
return sb.toString();
}
public static String untranspose(String s) {
StringBuilder sb = new StringBuilder();
sb.setLength(s.length());
for (int i = 0, j = s.length() - 1, x = 0; i <= j; ) {
sb.setCharAt(i++, s.charAt(x++));
if (i > j) break;
sb.setCharAt(j--, s.charAt(x++));
}
return sb.toString();
}
Это делает очевидным, что логика между двумя методами идентична ; единственная разница в том, что:
- В
transpose
, i
и j
- индексы чтения, x
- индекс записи
- В
untranspose
, i
и j
- индексы записи, x
- индекс чтения (т.е. наоборот)
Это действительно довольно просто:
i
всегда идет от начала до середины строки
j
всегда идет от конца до середины строки
x
всегда идет от начала до конца строки
- Если ввод нечетной длины, неизбежно
i == j
в конце концов
- На данный момент вам нужно только
i
, поэтому break
Лалит придумала первое рекурсивное решение ; этот по сути тот же самый, с незначительной модификацией:
public static String transpose(String s) {
int L = s.length();
return (L < 2) ? s
: s.substring(0, 1) + s.substring(L-1, L) + transpose(s.substring(1, L-1));
}
public static String untranspose(String s) {
int L = s.length();
return (L < 2) ? s
: s.substring(0, 1) + untranspose(s.substring(2, L)) + s.substring(1, 2);
}