博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(45):翻转句子中的单词顺序
阅读量:4287 次
发布时间:2019-05-27

本文共 2888 字,大约阅读时间需要 9 分钟。

题目描述

输入一个英文句子,翻转句子中单词的顺序,但是单词内字符的顺序不变。标点符号和普通字母一样处理。 例如输入字符串”I am a student.”,输出”student. a am I”。

分析

关键是需要确定一个翻转函数,实现字符串的翻转。之后分两个步骤达到目的:第一步翻转整个句子;第二步以空格为分隔符翻转单词,是单词恢复原来的顺序。

主要注意边界条件的判断:字符串为null或者为空串时,返回空串;字符串只有一个单词(不包含空格)时,返回字符串本身;while循环条件为开始索引startIndex小于字符串长度;以及翻转单词的条件判断语句endIndex == length || charArr[endIndex] == ' '不能反序的问题。

牛客AC;

package com.problem;/** * 输入一个英文句子,翻转句子中单词的顺序,但是单词内字符的顺序不变。标点符号和普通字母一样处理。 * 例如输入字符串"I am a student.",输出"student. a am I" *  * @author Administrator * */public class ReverseSentence {
public static void main(String[] args) { ReverseSentence reverseSentence = new ReverseSentence(); String str = "I am a student."; //String str = "Hello World!"; System.out.println(reverseSentence.reverseSentence(str)); } public String reverseSentence(String str) { if(str == null || str.length() <= 0) return ""; // 将字符串转为字符数组,才能实现传址的方式,保存翻转后的更改 // String作为函数传递并不会保存更改。 char[] charArr = str.toCharArray(); int length = charArr.length; int startIndex = 0; int endIndex = length - 1; // 扫描字符数组,统计空格的数目,如果不存在空格,则只有一个单词,不需要翻转 int blankCount = 0; for(char c : charArr) { if(c == ' ') blankCount++; } if(blankCount <= 0) return str; // 1、翻转整个句子 reverse(charArr, startIndex, endIndex); // 2、翻转句子中的单词 startIndex = 0; // 前后索引重新赋值 endIndex = 0; while(startIndex < length) { // 注意循环终止条件 if(charArr[startIndex] == ' ') { // 起始索引的字符为空格,则同时移动两个索引 startIndex++; endIndex++; // 后索引到达最后一个或者后索引所指的位空格时,翻转单词 // 两个或语句不能反序,否则可能出现两个单词的情况时候翻转出错 // 例如:如果反序,则输入"Hello world",输出"world elloH" } else if(endIndex == length || charArr[endIndex] == ' ' ) { endIndex--; // endIndex所指的位空格,需要回退一位 reverse(charArr, startIndex, endIndex); // 翻转单词 endIndex++; // endIndex重新指向空格 startIndex = endIndex; // startIndex更新成与endIndex保持一致 } else { // 这里只需要调整endIndex向后搜索 endIndex++; } } String resStr = String.copyValueOf(charArr); return resStr; } /** * 翻转函数 * @param charArr 需要翻转的字符数组 * @param startIndex 开始索引 * @param endIndex 结束索引 */ public void reverse(char[] charArr, int startIndex, int endIndex) { if(charArr == null || charArr.length <= 0 || startIndex > endIndex) return; // 前后索引方法,翻转字符数组 while(startIndex < endIndex) { char tmp = charArr[startIndex]; charArr[startIndex] = charArr[endIndex]; charArr[endIndex] = tmp; startIndex++; endIndex--; } }}

参考

1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

转载地址:http://hzxgi.baihongyu.com/

你可能感兴趣的文章
java/多线程二
查看>>
java/设计原则
查看>>
java/GUI 编程
查看>>
java/socket编程
查看>>
java/反射/JDK新特性
查看>>
java/AJAX
查看>>
java/AJAX/JSON/XML/JQUERY
查看>>
iOS加载控制器的三种方式/loadNibName与initwithNibName的区别
查看>>
java/tomcat /http协议
查看>>
java/severelet
查看>>
iOS编译问题的N种可能
查看>>
java/session/cookie/jsp(一)
查看>>
java/jsp/cookie/session/EL\context和request的生命周期(二)
查看>>
java/jsp/page/include/talib/javaBean、BeanUtils
查看>>
java/JSTL/EL函数/标签
查看>>
java/MySql
查看>>
java/jdbc数据库操作、事务处理、批处理、分页查询、元数据、
查看>>
java/事务与连接池
查看>>
iOS应用跳转到appstore更新和评价
查看>>
iOS MBProgressHUD的基本用法
查看>>