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] 养只小刺猬吧

猜你喜欢

转载自blog.csdn.net/Oliverfly1/article/details/106720350