题目

  • 题目描述
    将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
    所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
  • 输入描述:
    输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
  • 输出描述:
    得到逆序的句子
  • 示例1
  • 输入
    I am a boy
  • 输出
    boy a am I

代码和思路

package org.lht.boot.lang.suanfa;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
* @author haitao.li
* @description: 题目描述
* 将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
* 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
* <p>
* 输入描述:
* 输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。
* <p>
* 输出描述:
* 得到逆序的句子
* <p>
* 示例1
* 输入
* <p>
* I am a boy
* 输出
* <p>
* boy a am I
* @date 2021/4/14 9:44
*/
public class Huawei句子逆序 {


/**
* 利用String的spilt方法进行分割后逆序
*/
// public static void main(String[] args) throws IOException {
// BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
// String str = reader.readLine();
//
// String[] strings = str.split(" ");
// for (int i=0;i<strings.length/2;i++){
// String temp=strings[i];
// strings[i]=strings[strings.length-i-1];
// strings[strings.length-i-1]=temp;
// }
// for (int i=0;i<strings.length;i++){
// System.out.print(strings[i]+" ");
// }
// }


/**
* 牛客网最优解
* <p>
* 思路:
* 输入:I am a boy
* 第一步(将每个单词逆序):I ma a yob
* 第二步(将整体逆序):boy a am I
*
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
while ((str = br.readLine()) != null) {
int n = str.length();
char[] chars = str.toCharArray();
int i = 0, j = 0;
while (j <= n) {
if (j == n || chars[j] == ' ') {
reverse(chars, i, j - 1);
i = j + 1;
}
j++;
}
reverse(chars, 0, n - 1);
System.out.println(new String(chars));
}
}

public static void reverse(char[] chars, int i, int j) {
while (i < j) {
swap(chars, i++, j--);
}
}

public static void swap(char[] chars, int i, int j) {
char c = chars[i];
chars[i] = chars[j];
chars[j] = c;
}
}