#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
class Solution {
public:
string LeftRotateString(string str, int n);
void Reverse(string &str, int begin, int end);
string ReverseSentence(string str);
bool IsContinuous(vector<int> numbers);
int LastRemaining_Solution(int n, int m);
};
string Solution::LeftRotateString(string str, int n) {
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;
}
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;
}
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;
}
int Solution::LastRemaining_Solution(int n, int m) {
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;
}
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;
}
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;
}
void test3() {
vector<int> numbers = { 0,0,2,3,6 };
Solution s;
bool result = s.IsContinuous(numbers);
cout << (int)result;
return;
}
void test4() {
int n = 6, m = 2;
Solution s;
cout << s.LastRemaining_Solution(n, m);
return;
}
int main() {
test4();
system("pause");
return 0;
}