数组翻转_算法系列之翻转单词顺序

01 题目描述

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

02 解题

这道题我们可以分两步,第一步翻转所以字符的顺序如:I am a student. 翻转为 .tnedut a ma i。第二步,将每个单词中的所有字符翻转,结果为 student. a am i。

翻转数组实现:一个首指针start=0,尾指针end=arrays.length-1。分别指向字符串数组的头和尾。交换start和end所在位置的值。之后start++,end--;直到start >= end;

a313c1e7d2c440b92faf29c1abc6d1fe.png

翻转代码

public static void reverse(char[] chars, int start, int end) { while (start < end) { char tmp = chars[start]; chars[start] = chars[end]; chars[end] = tmp; start ++; end --; }}

第二步:翻转单词内部顺序

如 .tnedut a ma i。

记start=0,end=0;end++ 到下一个空格end=6,翻转 start 到end-1的值,

之后进入下一个单词 end++; start=end;end继续遍历到空格,翻转start到end-1的值。直到最后一个单词

public static char[] reverseWords(char []words) { if (words == null || words.length == 0) { return null; } int start = 0, end = 0; reverse(words, start, words.length - 1); // 1. 翻转整个数组 while (end < words.length) { if (words[end] != ' ') { end ++; } else { reverse(words, start, end - 1); end ++; start = end; } } System.out.println(words); return words;}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值