左旋转字符串,翻转单词顺序列,扑克牌顺子,圆圈中最后剩下的数(剑指offer43-46)c++版本

#include <iostream>
#include <vector>
#include <algorithm>
#include <list>

using namespace std;

class Solution {
public:
	//JZ43 左旋转字符串 
	string LeftRotateString(string str, int n);
	void Reverse(string &str, int begin, int end);
	//JZ44 翻转单词顺序列
	string ReverseSentence(string str);
	//JZ45 扑克牌顺子
	bool IsContinuous(vector<int> numbers);
	//JZ46 圆圈中最后剩下的数
	int LastRemaining_Solution(int n, int m);
};

//JZ43 左旋转字符串 
string Solution::LeftRotateString(string str, int n) {
	//旋转3遍
	if (n < 0 || str.empty())	return "";
	int len = str.size();
	int k = n % len;
	Reverse(str, 0, len - 1);
	Reverse(str, 0, len - k - 1);
	Reverse(str, len - k, len - 1);
	return str;
}
void Solution::Reverse(string &str, int begin, int end) {
	while (begin < end) {
		char temp = str[begin];
		str[begin++] = str[end];
		str[end--] = temp;
	}
	return;
}
//JZ44 翻转单词顺序列
string Solution::ReverseSentence(string str) {
	if (str.empty())	return "";
	int len = str.size();
	int begin = 0, end = len - 1;
	Reverse(str, begin, end);
	for (int i = 0; i < len; i++) {
		if (str[i] == ' ' && i != 0) {
			Reverse(str, begin, i-1);
			begin = i + 1;
		}
	}
	Reverse(str, begin, len - 1);
	return str;
}
//JZ45 扑克牌顺子
bool Solution::IsContinuous(vector<int> numbers) {
	//排序,记录大小王的个数
	if (numbers.empty())	return false;
	sort(numbers.begin(), numbers.end());
	int len = numbers.size();
	int i = 0;
	int count = 0;//记录大小王的个数
	while (i < len) {
		if (numbers[i] == 0)	count++;
		else
		{
			break;
		}
		i++;
	}
	for (i = count; i < len; i++) {
		if (numbers[i] == numbers[i - 1])	return false;//有对子
	}
	if (numbers[len - 1] - numbers[count] > len - 1)	return false;
	return true;
}
//JZ46 圆圈中最后剩下的数
int Solution::LastRemaining_Solution(int n, int m) {
	//数学方法参见剑指offer。链表求解。
	if (n <= 0 || m <= 0)	return -1;
	list<int> table;
	for (int i = 0; i < n; i++) {
		table.push_back(i);
	}
	int numsoftable = n;
	int index = 0;
	list<int>::iterator it = table.begin();
	while (numsoftable != 1) {
		while (index < m - 1) {
			if (it == table.end())	it = table.begin();//构成循环
			it++;
			index++;
		}
		if (it == table.end())	it = table.begin();
		list<int>::iterator temp = it;
		it++;
		table.erase(temp);
		numsoftable--;
		index = 0;
	}
	it = table.begin();
	return *it;
}

//JZ43 左旋转字符串 
void test1() {
	string str = "abcXYZdef";
	Solution s;
	string result = s.LeftRotateString(str, 3);
	int len = result.size();
	for (int i = 0; i < len; i++) {
		cout << result[i];
	}
	return;
}
//JZ44 翻转单词顺序列
void test2() {
	string str = "student. a am I";
	Solution s;
	string result = s.ReverseSentence(str);
	int len = result.size();
	for (int i = 0; i < len; i++) {
		cout << result[i];
	}
	return;
}
//JZ45 扑克牌顺子
void test3() {
	vector<int> numbers = { 0,0,2,3,6 };
	Solution s;
	bool result = s.IsContinuous(numbers);
	cout << (int)result;
	return;
}
//JZ46 圆圈中最后剩下的数
void test4() {
	int n = 6, m = 2;
	Solution s;
	cout << s.LastRemaining_Solution(n, m);
	return;
}

int main() {
	//test1();
	//test2();
	//test3();
	test4();
	system("pause");
	return 0;
}