蓝桥杯算法训练 奇变的字符串

问题描述

    将一个字符串的奇数位(首位为第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“+”的拼接方式。具体原因点此查看

posted @ 2020-03-13 22:43  Alex-jzw  阅读(301)  评论(0)    收藏  举报