2016华为校招旋转字符串

字符串的旋转问题
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值