算法提高 字符串的操作 java 题解 356

问题描述

  给出一个字符串S,然后给出q条指令,分别有4种:

  1. Append str
  表示在S的最后追加一个字符串str。
  例:
  原字符串:ABCDE
  执行 Append FGHIJ 后
  字符串变为:ABCDEFGHIJ

  2. Insert x str
  表示在位置x处插入一个字符串str。(输入保证0<x<=当前字符串长度)
  例:
  原字符串:ABCGHIJ
  执行 Insert 4 DEF 后
  字符串变为:ABCDEFGHIJ

  3. Swap a b c d
  表示交换从第a位到第b位的字符串与从第c位到第d位的字符串。(输入保证0<a<b<c<d<=当前字符串长度)
  例:
  原字符串:ABGHIFCDEJ
  执行 Swap 3 5 7 9后
  字符串变为:ABCDEFGHIJ

  4. Reverse a b
  表示将从第a位到第b位的字符串反转。(输入保证0<a<b<=当前字符串长度)
  例:
  原字符串:ABGFEDCHIJ
  执行 Reverse 3 7 后
  字符串变为:ABCDEFGHIJ

  最后输出按顺序执行完指令后的字符串。

输入格式

  输入第一行包含字符串S,第二行包含一个整数q,接下来q行分别为q个指令。

输出格式

  输出为1行,为按顺序执行完输入指令后的字符串。

样例输入

My
5
Append Hello
Insert 3 dlroW
Reverse 3 7
Swap 3 7 8 12
Swap 1 2 3 7

样例输出

HelloMyWorld

样例说明

  原字符串:My
  执行 Append Hello 后:MyHello
  执行 Insert 3 dlroW 后:MydlroWHello
  执行 Reverse 3 7 后:MyWorldHello
  执行 Swap 3 7 8 12 后:MyHelloWorld
  执行 Swap 1 2 3 7 后:HelloMyWorld


解题思路:

字符串的常规操作,尽量将各种操作封装成方法,使代码风格清晰。

java代码:

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String str = br.readLine();
		int n = Integer.parseInt(br.readLine());
		String[]s = new String[n];
		for(int i = 0; i < n; i++) {
			s[i] = br.readLine();
		}
		StingHandle obj = new StingHandle(str, s);
		obj.handle();
		System.out.println(obj.ans);
	}
}
class StingHandle{
	String []s;
	StringBuilder ans = new StringBuilder();
	public StingHandle(String str, String[] s) {
		this.s = s;
		ans = new StringBuilder(str);
	}
	
	public void handle() {
		for(int i = 0; i < s.length; i++) {
			char c = s[i].charAt(0);
			if(c == 'A') {
				append(s[i].substring(7));
			}else if(c == 'I') {
				String[] split = s[i].split(" ");
				insert(Integer.parseInt(split[1]), split[2]);
			}else if(c == 'R') {
				String[] split = s[i].split(" ");
				reverse(Integer.parseInt(split[1]), Integer.parseInt(split[2]));
			}else {
				String[] split = s[i].split(" ");
				int a = Integer.parseInt(split[1]);
				int b = Integer.parseInt(split[2]);
				int cc = Integer.parseInt(split[3]);
				int d = Integer.parseInt(split[4]);
				swap(a, b, cc, d);
			}
		}
	}
	
	public void append(String des) {
		ans.append(des);
	}
	
	public void insert(int a, String des) {
		a = a - 1;
		ans.insert(a, des);
	}
	
	public void reverse(int a, int b) {
		a = a - 1;
		String s1 = ans.substring(a, b);
		String s3 = ans.substring(b, ans.length());
		StringBuilder ans2 = new StringBuilder(s1);
		ans2.reverse();
		ans.delete(a, ans.length());
		ans.append(ans2);
		ans.append(s3);
	}
	
	public void swap(int a, int b, int c, int d) {
		a -= 1;
		c -= 1;
		String s1 = ans.substring(a, b);
		String s2 = ans.substring(b, c);
		String s3 = ans.substring(c, d);
		String s4 = ans.substring(d, ans.length());
		ans.delete(a, ans.length());
		ans.append(s3);
		ans.append(s2);
		ans.append(s1);
		ans.append(s4);
	}
}

提交截图:

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值