《剑指offer》面试题42:翻转单词顺序VS左旋转字符串

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

思路:以"I am a student."为例,

  1. 翻转整个句子。例子为,".tneduts a ma I"。
  2. 以空格为界,翻转单个单词。

需要辅助方法去翻转void ...(char[], int startIndex, int endIndex)。

public String ReverseStr(String str) {
	char[] cs = str.toCharArray();
	ReverseWord(cs, 0, cs.length-1);	// 翻转整个句子
	int start = 0, end = start;
	while (end < cs.length) {
		if (cs[end] == ' ') {
			ReverseWord(cs, start, end-1);	// 空格为界,翻转单个单词
			start = end+1;
		}
		end ++;
	}
	return String.valueOf(cs);
}
public void ReverseWord(char[] cs, int start, int end) {
	while (start <= end) {
		Character c = ' ';
		c = cs[end];
		cs[end] = cs[start];
		cs[start] = c;
		start ++;
		end --;
	}
}

题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。

思路:左旋转实质为交换前后两个部分。以"abcdefg"为例。

  1. 将字符串整体翻转。例子为,"gfedcba"。
  2. 以输入参数为界,将字符串分为两部分,翻转前面部分。翻转两次,即回到原位。两个部分各自翻转,则实现前后两个部分各自回到原位,即实现了两个部分的整体交换。例子为,"cdefgab"。
public String LeftRotateStr(String str, int loc) {
	char[] cs = str.toCharArray();
	ReverseWord(cs, 0, cs.length-1);
	System.out.println(String.valueOf(cs));
	ReverseWord(cs, 0, cs.length-1-loc);	// 翻转两次,回到原位
	ReverseWord(cs, cs.length-loc, cs.length-1);
	return String.valueOf(cs);
}
public void ReverseWord(char[] cs, int start, int end) {
	while (start <= end) {
		Character c = ' ';
		c = cs[end];
		cs[end] = cs[start];
		cs[start] = c;
		start ++;
		end --;
	}
}

猜你喜欢

转载自blog.csdn.net/qq_25024883/article/details/80485535