我需要处理一个字符串来交换几个字符以进行简单加密。
Input : ABCDEFGHIJKLMNOPQRSTUVWXYZ
Output: NOPQRSTUVWXYZABCDEFGHIJKLM
在上面的过程中,我将琴弦分成两部分,并将前半部分移动到后半部分。
final int mid = (xyz.length()+1) / 2;
String[] spstr = {
xyz.substring(0, mid),
xyz.substring(mid),
};
String firstMix=spstr[1]+spstr[0];
System.out.println(firstMix);
现在,我需要将前两个字符与最后两个字符交换
Input : NOPQRSTUVWXYZABCDEFGHIJKLM
Output: LMPQRSTUVWXYZABCDEFGHIJKNO
并将两个字符立即交换到字符串中间的左侧,并紧跟其后的两个字符。
Input : LMPQRSTUVWXYZABCDEFGHIJKNO
Output : LMPQRSTUVWXABYZCDEFGHIJKNO
交换发生在" YZAB"到" ABYZ"在约输入和输出
有效交换这些字符的最佳方法是什么?我会在这个过程中转换很多字符串。在这种情况下,字符串长度不是常量。
答案 0 :(得分:2)
我只是创建一个方法,将字符串转换为数组,并使用它们的索引来操作和加密字符。
答案 1 :(得分:2)
您可能想尝试使用StringBuilder类。它为操作字符串提供了许多有用的方法,但避免了在进程中创建大量String对象的问题。
答案 2 :(得分:1)
最佳方法是将字符串拆分为字符串数组并执行 根据您的要求进行以下处理
import java.util.Arrays;
public class HelloWorld{
public static void main(String []args){
System.out.println("Hello World");
String xyz= "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final int mid = (xyz.length()+1) / 2;
String[] spstr = {
xyz.substring(0, mid),
xyz.substring(mid)
};
String firstMix=spstr[1]+spstr[0];
String[] array = firstMix.split("");
//Swap first and last two characters
for(int i=1;i<3;i++)
{
String temp= array[i];
array[i]=array[array.length-i];
array[array.length-i]=temp;
}
String str1 = Arrays.toString(array);
str1 = str1.substring(1, str1.length()-1).replaceAll(",", "");
//Swap two characters left of middle with right of middle
int j=2;
for(int i=((array.length/2)-2);i<(array.length)/2;i++)
{
String temp= array[i];
array[i]=array[array.length/2+j];
array[array.length/2+j]=temp;
j--;
}
String str2 = Arrays.toString(array);
str2 = str2.substring(1, str2.length()-1).replaceAll(",", "");
System.out.println( firstMix);
System.out.println(str1);
System.out.println(str2);
}
}
答案 3 :(得分:1)
这是大致正确的,除了将字符串长度上的中间字符交换为奇数的未定义情况。评论应该足以理解代码。
public class Main {
public static void main( String[] args ) {
char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
final int mid = ( chars.length + 1 ) / 2;
System.out.println( "Mid: " + mid );
System.out.println( "Start : " + new String( chars ) );
// Pass one : Swap first half chars with last half chars
if( ( chars.length % 2 ) == 1 ) {
/* We swap the characters this way because the left half
* is one character longer than the right half. To avoid
* unnecessary copies we move the right character to
* the index before the left character and save the first
* character to be placed at the mid point
*/
char first = chars[ 0 ];
for( int l = 1, r = mid; r < chars.length; l++, r++ ) {
chars[ l - 1 ] = chars[ r ];
chars[ r ] = chars[ l ];
}
chars[ mid - 1 ] = first;
}
else {
for( int l = 0, r = mid; r < chars.length; l++, r++ ) {
swap( chars, l, r );
}
}
System.out.println( "Pass 1: " + new String( chars ) );
// Pass two: Swap first two chars with last two chars
swap( chars, 0, chars.length - 2 );
swap( chars, 1, chars.length - 1 );
System.out.println( "Pass 2: " + new String( chars ) );
// Pass three: Swap middle 4 characters.
swap( chars, mid - 1, mid + 1 );
swap( chars, mid - 2, mid );
System.out.println( "Pass 3: " + new String( chars ) );
}
public static void swap( char[] chars, int l, int r ) {
char tmp = chars[ l ];
chars[ l ] = chars[ r ];
chars[ r ] = tmp;
}
}
我选择使用字符数组进行操作以减少创建的对象数量。在我看来,这为您所要求的提供了最快捷的解决方案。当/如果你澄清未定义的情况我可以编辑代码以提供正确的输出。