【华为OD题库-069】按单词下标区间翻转文章内容-java

题目

题目描述:
输入一个英文文章片段,翻转指定区间的单词顺序,标点符号和普通字母一样处理。例如输入字符串“I am a developer.”,区间[0,3]则输出"developer. a am l"。
输入描述:
使用换行隔开三个参数
第一个参数为英文文章内容,即英文字符串
第二个参数为反转起始单词下标,下标从0开始
第三个参数为结束单词下标
输出描述:
反转后的英文文章片段,所有单词之间以—个半角空格分割进行输出
示例1
输入∶
l am a developer.
1
2
输出:
l a am developer.
示例2
输入∶
Hello world!
0
1
输出:
world! Hello
说明:
输入字符串可以在前面或者后面包含多余的空格,但是反转后的不能包含多余空格。
示例3
输入∶
I am a developer.
0
3
输出:
developer. a am l
说明:
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
示例4
输入:
Hello!
0
3
输出:
Hello!
说明:
指定反转区间只有一个单词,或无有效单词则统—输出原字符串。

思路

简单的字符处理题,可以利用栈的先入后出实现翻转,也可以利用双指针交换实现翻转

题解

package hwod;

import java.util.LinkedList;
import java.util.Scanner;

public class ReverseWord {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String content = sc.nextLine();
        int start = sc.nextInt();
        int end = sc.nextInt();
        System.out.println(reverseWord(content, start, end));
        System.out.println(reverseWord2(content, start, end));
    }

    //方案一:利用栈实现翻转
    private static String reverseWord(String content, int start, int end) {
        String[] arrs = content.trim().split("\\s+");
        start = Math.max(0, start);
        end = Math.min(arrs.length - 1, end);
        if (start >= end) return content; //题目未明确要求,此分支不处理多余空格
        LinkedList<String> stack = new LinkedList<>();
        StringBuilder sb = new StringBuilder();
        int i = 0;
        while (i < arrs.length) {
            if (i != 0) sb.append(" ");
            if (i < start || i > end) {
                sb.append(arrs[i]);
                i++;
            } else {
                while (start <= i && i <= end) {
                    stack.addLast(arrs[i]);
                    i++;
                }
                while (!stack.isEmpty()) {
                    sb.append(stack.removeLast());
                    if (!stack.isEmpty()) sb.append(" ");
                }
            }
        }
        return sb.toString();
    }

    //方案二:双指针翻转
    private static String reverseWord2(String content, int start, int end) {
        String[] arrs = content.trim().split("\\s+");
        start = Math.max(0, start);
        end = Math.min(arrs.length - 1, end);
        if (start >= end) return content; //题目未明确要求,此分支不处理多余空格
        while (start < end) {
            swap(arrs, start, end);
            start++;
            end--;
        }
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < arrs.length; i++) {
            if (i != 0) sb.append(" ");
            sb.append(arrs[i]);
        }
        return sb.toString();

    }

    private static void swap(String[] arrs, int start, int end) {
        String tmp = arrs[start];
        arrs[start] = arrs[end];
        arrs[end] = tmp;
    }
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

说明

本专栏所有文章均为原创,欢迎转载,请注明文章出处:https://blog.csdn.net/qq_31076523/article/details/134176793。百度和各类采集站皆不可信,搜索请谨慎鉴别。技术类文章一般都有时效性,本人习惯不定期对自己的博文进行修正和更新,因此请访问出处以查看本文的最新版本。

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值