字符串的旋转问题
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
测试样例:
“ABCDEFGH”,8,4
返回:”FGHABCDE”
class StringRotation {
public:
string rotateString(string A, int n, int p)
{
queue<char> q;
string temp;
auto i = A.begin();
if (n != A.size())
{
return false;
}
while (n--)
{
q.push(*i++);
}
p++;
while (p--)
{
q.push(q.front());
q.pop();
}
while (q.size())
{
char ch = q.front();
temp.append(&ch,1);
q.pop();
}
return temp;
}
};
在沾沾自喜ac的时候,又看了一眼牛人的答案,简直不再同
一个等级上。这里附录两个比较好的答案。
一:
string b=A+A;
string a=b.substr(p+1,n);
return a;
二:
reverse(A.begin(), next(A.begin(), p+1));
reverse(next(A.begin(), p+1), A.end());
reverse(A.begin(), A.end());
总结一下reverse的用法。
template
void reverse(
BidirectionalIterator _First,
BidirectionalIterator _Last
);
参数
_First
指向第一个元素的位置的双向迭代器在元素交换的范围。
_Last
指向通过最终元素的位置的一双向迭代器在元素交换的范围。
备注
引用的源范围必须是有效的;所有指针必须dereferenceable,并在该序列中最后位置以访问按增量。
示例
// alg_reverse.cpp
// compile with: /EHsc
int main( ) {
using namespace std;
vector <int> v1;
vector <int>::iterator Iter1;
int i;
for ( i = 0 ; i <= 9 ; i++ )
{
v1.push_back( i );
}
cout << "The original vector v1 is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
// Reverse the elements in the vector
reverse (v1.begin( ), v1.end( ) );
cout << "The modified vector v1 with values reversed is:\n ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")." << endl;
}
与反转的值的已修改的向量v1是:(9 8 7 6 5 4 3 2 1 0)。
要求
标头:
命名空间: std