字符串 单词 翻转

       阅读(269)  2018-06-11 15:32:00

如将字符串"abcdef"的前两个字符翻转到后面变成"cdefab"。

整个字符串可以分为左边和右边两部分,翻转思路是:

  • 将左边字符串反序("ab"变成"ba")
  • 将右边字符串反序("cdef"变成"fedc")
  • 左右部分反序后的组合是"bafedc"
  • 最后将整个字符串反序("bafedc"变成"cdefab")得到我们要的结果

完整代码如下:

void invertStr(char str[], int start, int end)
{
	while (end > start) {
		char temp = str[start];
		str[start] = str[end];
		str[end] = temp;
		++start;
		--end;
	}
}

void rotateStr(char str[], int len, int leftLen)
{
	leftLen %= len;
	invertStr(str, 0, leftLen - 1);
	invertStr(str, leftLen, len - 1);
	invertStr(str, 0, len - 1);
}

int _tmain(int argc, _TCHAR* argv[])
{
	char str[] = "abcdef"; // defabc
	std::cout << "before:" << str << std::endl;
	rotateStr(str, strlen(str), 2);
	std::cout << "after:" << str << std::endl;

	system("pause");
	return 0;
}

std::string版

class Solution {
public:
	string LeftRotateString(string str, int n) {
		if (str.empty()) {
			return "";
		}

		n %= str.size();
		Invert(str, 0, n - 1);
		Invert(str, n, str.size() - 1);
		Invert(str, 0, str.size() - 1);
		return str;
	}

	void Invert(string &str, int from, int to) {
		while (from < to) {
			std::swap(str[from++], str[to--]);
		}
	}
};

单词翻转

class Solution {
public:
	string ReverseSentence(string str) {
		int index = 0;
		for (int i = 0, count = str.size(); i < count; i++) {
			if (str[i] == ' ') {
				Invert(str, index, i - 1);
				index = i + 1;
			}
		}
		Invert(str, index, str.size() - 1);
		Invert(str, 0, str.size() - 1);
		return str;
	}

	void Invert(string &str, int from, int to) {
		while (from < to) {
			std::swap(str[from++], str[to--]);
		}
	}
};

如:I am a student翻转为student a am I

文章评论

Keep it simple,stupid
文章数
283
总访问量
260033
今日访问
363
最近评论

ningto : 请到next.ningto.com里发表评论。
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部