蓝桥杯算法训练 奇变的字符串
问题描述
将一个字符串的奇数位(首位为第0位)取出,将其顺序弄反,再放回原字符串的原位置上。
如字符串"abcdefg",奇数位为"bdf",顺序弄反后为"fdb",最后得到字符串"afcdebg"。
输入格式
输入共一行,为一个字符串,字符串中无空格。
输出格式
输出共一行,为一个字符串,即最后得到的字符串。
样例输入
abcdefg
样例输出
afcdebg
算法思路
这道算法题思路简单。首先我们先将奇数位的字符取出拼接成一个字符串,然后将该字符串反转后,替换掉原来奇数位中的字符即可。
算法实现
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String s = input.next();
char[] chars = s.toCharArray();//将输入的字符串转换为字符数组,这样方便后续的奇数位替换操作
StringBuffer stringBuffer = new StringBuffer();//new一个StringBuffer对象用于拼接奇数位的字符串
for (int i = 0; i < chars.length; i++) {
if(i % 2 != 0){
stringBuffer.append(chars[i]);
}
}
//奇数位字符串反转
String reverse = stringBuffer.reverse().toString();
int j = 0;//设置自增变量j,用于逐个从奇数位字符串的反转串中取值
for (int i = 0; i < chars.length; i++) {
if(i % 2 != 0){
chars[i] = reverse.charAt(j);
j++;
}
}
System.out.println(String.valueOf(chars));//将字符数组转化为字符串打印输出
}
}
借此题说一下字符串反转两种方法
- 利用字符串现成的reverse()方法,示例代码如下:
String str = "abcdefg";
String reverse = new StringBuffer(str).reverse().toString();//将字符串先转成StringBuffer或StringBuilder对象,然后调用它的reverse()方法
- 手写字符串反转函数
//递归版
public static String reverse(String s){
if(s.length() <= 1){//递归的出口
return s;
}
return s.substring(s.length()-1) + f(s.substring(0,s.length()-1));//每次取出字符串的最后一个,然后与字符串前length-1个元素的递归结果相拼接
}
//非递归版
public static void reverse(String s){
char[] chars = s.toCharArray();//将字符串转为字符数组
StringBuffer sb = new StringBuffer();//new一个StringBuffer对象用于拼接逆序结果
for (int i = chars.length - 1; i >= 0; i--) {
sb.append(charStr[i]);
}
System.out.println(sb);
}
注意:以后在拼接字符串的时候尽量使用StringBuffer的方式,因为在效率上StringBuffer拼接字符串的方式要远远高于String“+”的拼接方式。具体原因点此查看

浙公网安备 33010602011771号