Day44:翻转单词顺序列
剑指Offer_编程题——翻转单词顺序列
题目描述:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
具体要求:
时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M
具体实现:
思路一: 利用辅助栈解决该问题,利用栈的“先进后出”特性。全部入栈后然后依次出栈,并在每个元素之间添加“ ”。我们分别用java和python两种主流语言来将其实现。 1、首先我们用java来实现:
import java.util.Stack;
public class Solution{
public static String ReverseSentence(String str){
int len=str.length();
String str_rever="";
str=" "+str;
Stack<Character> stack=new Stack<>();
for (int i = str.length()-1; i>=0; i--) {
if (str.charAt(i)!=' ') {
stack.push(str.charAt(i));
}else {
while (!stack.isEmpty()) {
str_rever+=stack.pop();
}
str_rever+=" ";
}
}
return str_rever.substring(0, len);
}
}
代码效果图如图所示:
此代码可以在牛客网上可以实现,但是我们如果在本地的话测试结果的话即得加上main函数,具体实现如下:
public static void main(String[] args){
System.out.println(ReverseSetence("Student a am I"));
}
代码测试效果图如下:
2、用python实现以上思路
class Solution:
def ReverseSentence(self, s):
if s is None or len(s) == 0:
return s
stack = s.split(' ')
res = ""
while len(stack) > 0:
res += stack.pop() + " "
res = res[:-1]
return res
代码效果图如图所示:
思路二: 拆分字符串,反向重组。先对原始字符串以空格进行分割,分割成不同的单词,以字符串数组形式存放,然后从后往前遍历数组,逐个加入到stringbuffer中,每次加入一个后再加入一个空格“ ”,当到数组第一个位置时,不添加空格。我们分别用java和python将其实现。 1、我们首先用java将其实现。
public class Solution{
public static String ReverseSentence(String str){
if(str.trim().equals(""))
return str;
String[] list = str.split(" ");
StringBuffer sb = new StringBuffer();
for(int i = list.length - 1; i >= 0; i--){
if(i != 0){
sb.append(list[i]);
sb.append(" ");
}else
sb.append(list[i]);
}
return sb.toString();
}
}
代码效果图如图所示:
代码测试效果图如下:
2、用python实现该思路
class Solution:
def ReverseSentence(self, s):
if s is None:
return s
l = s.split(" ")
return(" ".join(l[::-1]))
代码效果图如图所示:
思路三: 两次反转的思路,先把整个字符串整体反转,如student. a am I”反转为I ma a .tneduts”。第二步:各个单词翻转 “I am a student.”。我们分别用java和python将其实现: 1、首先我们用java实现该思路:
public class Solution{
public static String ReverseSentence(String str){
char[] chars = str.toCharArray();
reverse(chars, 0, chars.length - 1);
int blank = -1;
for(int i = 0; i < chars.length; i++){
if(chars[i] == ' '){
int nextBlank = i;
reverse(chars, blank + 1, nextBlank - 1);
blank = nextBlank;
}
}
reverse(chars, blank + 1, chars.length - 1);
return new String(chars);
}
public static void reverse(char[] chars, int low, int high){
while(low < high){
char temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}
}
代码效果图如图所示:
代码效果测试如下图所示:
2、用Python将其思路实现:
class Solution:
def ReverseSentence(self, s):
if not s:
return s
s = list(s)
self.reverse(s, 0, len(s) - 1)
start, end = 0, 0
while start < len(s):
if s[start] == ' ':
start += 1
end += 1
elif end == len(s) or s[end] == ' ':
self.reverse(s, start, end - 1)
end += 1
start = end
else:
end += 1
return ''.join(s)
def reverse(self, s, start, end):
while start < end:
s[start], s[end] = s[end], s[start]
start += 1
end -= 1
代码效果图如图所示:
总结
本道题通过与上一道题类似,均是通过实际问题来考察我们对字符串的理解,我们对本题给出了三种解题思路,均分别用java和python将其实现。首先就是借用栈的“先进先出”的特性进行解题,并在每个元素之间添加‘ ‘。其次是利用拆分字符串,反向重组的思路。最后是利用两次反转的思路。因此,我们在做题的时候,应该多次尝试各种方法,扩展自己的思维,写出优质的代码。总之,我们要继续加油,争取早日找到工作,Good Luck!!!
参考文献
[1] 白马长枪儒雅将 [2] DoubleTrees_L [3] 养只小刺猬吧
- 深入剖析Spring(二)——IoC容器的实现
- JDBC上关于数据库中多表操作一对多关系和多对多关系的实现方法
- 深入剖析Spring(一)——IoC的基本概念(从面向对象角度介绍)
- Restful安全认证及权限的解决方案
- Java并发容器大合集
- Java并发编程的艺术(九)——批量获取多条线程的执行结果
- web.xml中load-on-startup的作用
- Java并发编程的艺术(七)——Executors
- Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解
- PowerDesigner使用教程|使用方法
- Java并发编程的艺术(一)——并发编程需要注意的问题
- 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现
- Java并发编程的艺术(三)——volatile
- java学习手册-java 新手入门必看的30个题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法