#include <iostream>
#include <cstring>
using namespace std;
void Reverse(char* arr, int nLow, int nHigh)
{
for (; nLow < nHigh; ++nLow, --nHigh)
{
char cTmp = arr[nHigh];
arr[nHigh] = arr[nLow];
arr[nLow] = cTmp;
}
}
void RightShift(char* strOrg, int nLen, int nShift)
{
nShift %= nLen;
if (nShift < 0) nShift += nLen;
Reverse(strOrg, 0, nLen - nShift - 1);
Reverse(strOrg, nLen - nShift, nLen - 1);
Reverse(strOrg, 0, nLen - 1);
}
int main(int argc, char* argv[])
{
cout<< "右移字符串:要求线性复杂度O(n),空间复杂度O(1)。" << endl;
cout<< " 举例:把abcdef右移2位得到efabcd"<< endl;
char strOrg[10] = "abc123efg"; //保存原始字符串
int nShiftBit = 3; //右移位数
cout<< "解法:三次反转,直接线性"<< endl<< endl;
cout<< "原始字符串:"<< strOrg<< "\t右移位数:"<< nShiftBit<< endl;
RightShift(strOrg, strlen(strOrg), nShiftBit);
cout<< "结果:"<< strOrg<< endl<< endl;
nShiftBit = -3;
cout<< "原始字符串:"<< strOrg<< "\t右移位数:"<< nShiftBit<< endl;
RightShift(strOrg, strlen(strOrg), nShiftBit);
cout<< "结果:"<< strOrg<< endl;
return 0;
}
#include <cstring>
using namespace std;
void Reverse(char* arr, int nLow, int nHigh)
{
for (; nLow < nHigh; ++nLow, --nHigh)
{
char cTmp = arr[nHigh];
arr[nHigh] = arr[nLow];
arr[nLow] = cTmp;
}
}
void RightShift(char* strOrg, int nLen, int nShift)
{
nShift %= nLen;
if (nShift < 0) nShift += nLen;
Reverse(strOrg, 0, nLen - nShift - 1);
Reverse(strOrg, nLen - nShift, nLen - 1);
Reverse(strOrg, 0, nLen - 1);
}
int main(int argc, char* argv[])
{
cout<< "右移字符串:要求线性复杂度O(n),空间复杂度O(1)。" << endl;
cout<< " 举例:把abcdef右移2位得到efabcd"<< endl;
char strOrg[10] = "abc123efg"; //保存原始字符串
int nShiftBit = 3; //右移位数
cout<< "解法:三次反转,直接线性"<< endl<< endl;
cout<< "原始字符串:"<< strOrg<< "\t右移位数:"<< nShiftBit<< endl;
RightShift(strOrg, strlen(strOrg), nShiftBit);
cout<< "结果:"<< strOrg<< endl<< endl;
nShiftBit = -3;
cout<< "原始字符串:"<< strOrg<< "\t右移位数:"<< nShiftBit<< endl;
RightShift(strOrg, strlen(strOrg), nShiftBit);
cout<< "结果:"<< strOrg<< endl;
return 0;
}