#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;
}
左旋转字符串,翻转单词顺序列,扑克牌顺子,圆圈中最后剩下的数(剑指offer43-46)c++版本
最新推荐文章于 2025-05-23 11:12:15 发布