首页 > 试题广场 >

字符串挪移

[编程题]字符串挪移
  • 热度指数:342 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
~~~~~~长度为  只包含小写字母的字符串 ,下标  开始。进行  次操作,第  次操作将  移动到字符串末尾。输出  次操作后的字符串。
~~~~~~例如字符串 \texttt { ,第一步 \texttt { ,第二步 \texttt{ ,第三步 \texttt{ ,第四步 \texttt{ ,第五步 \texttt{ 。

输入描述:
~~~~~~在一行上输入一个由小写字母构成的字符串,长度记为 n\ (1 \le n \le 10^6) 


输出描述:
~~~~~~在一行上输出一个字符串,表示操作后的字符串。
示例1

输入

paectc

输出

accept

说明

第一步 ,第二步 ,第三步 ,第四步 ,第五步 ,第六步 
示例2

输入

abqde

输出

bdaeq

备注:


import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static char[] ret;
    public static int cur;
    public static void dfs(char[] strArray,boolean flag){
        if(strArray.length==1){
            ret[cur++]=strArray[0];
            return;
        }
        int n=strArray.length;
        char[] nextArray;
        if(flag){
            nextArray=new char[(n+1)/2];
        }else{
            nextArray=new char[(n)/2];
        }
        int p=0;
        boolean newFlag=false;
        //flag通过本次是否最后一个元素加入ret来判断
        if(flag){
            for(int i=0;i<n;i++){
                if(i%2==0){
                    nextArray[p++]=strArray[i];
                    if(i==n-1){
                        newFlag=false;
                    }
                }else{
                    ret[cur++]=strArray[i];
                    if(i==n-1){
                        newFlag=true;
                    }
                }
            }
        }else{
            for(int i=0;i<n;i++){
                if(i%2==1){
                    nextArray[p++]=strArray[i];
                    if(i==n-1){
                        newFlag=false;
                    }
                }else{
                    ret[cur++]=strArray[i];
                    if(i==n-1){
                        newFlag=true;
                    }
                }
            }
        }
        dfs(nextArray,newFlag);
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str=in.nextLine();
        int n=str.length();
        ret=new char[n];
        int cur=0;
        char[] strArray=str.toCharArray();
        dfs(strArray,true);
        System.out.println(new String(ret));
    }
}

发表于 2025-10-18 22:28:40 回复(0)

const
rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    let input, result=[];
    while ((line = await readline())) {
        input = line.split("");
    }
    function slove(b) {
        if(b.length==1){
            result.push(b[0])
            return
        }
        
        //模拟每次处理字符串时把偶索引与奇索引位置提出
        //如果处理的字符串是偶索引正常加入结果
        //如果处理的字符串是奇数把奇索引第一位放入结果 并且去除奇索引的第一位
        if(b.length%2==0){
            result = [...result,...b.filter((item,index)=>index%2!=0)]
            slove(b.filter((item,index)=>index%2==0))
        }else{
            let test = b.filter((item,index)=>index%2==0)
            result = [...result,...b.filter((item,index)=>index%2!=0),test[0]]
            slove(test.slice(1))
        }
    }
    slove(input);
    console.log(result.join(''));
})();

发表于 2025-12-11 11:20:17 回复(0)
import java.util.Scanner;

import java.io.*;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static String[] lineP;
    public static String line;
    public static int n;
    public static void main(String[] args)throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(System.out);

        while ((line = br.readLine()) != null) {
            n = line.length();
            out.println(moveChar(line, n));
        }
        out.flush();
        out.close();
    }
    //模拟移动过程即可
    public static String moveChar(String str, int n) {
        char[] arr = new char[n + n];
        int i = 0;
        for (char c : str.toCharArray()) {
            arr[i] = c;
            i++;
        }
        for (int j = 0, cur = 0; j < n && cur < 2 * n;) {
            if (j == i - n) {
                char c = arr[cur];
                //全为小写字母,选择一个大写字母占位
                arr[cur++] = 'A';
                arr[i++] = c;
                //重定向当前位置,把位置赋值给 j 
                j = cur + n -i;
            }
            else if (arr[cur] != 'A' ) {
                j++;cur++;
            } else {
                cur++;
            }
        }
        i = 0;
        for (int k = 0; k < arr.length; k ++) {
            if (arr[k] != 'A')arr[i++] = arr[k];
        }
        String ans = new String(arr);
        return ans.substring(0, i);
    }
}
发表于 2025-11-23 14:50:28 回复(0)