操作字符串的功能(“abcdef” - >“faebdc”)

时间:2012-07-11 15:58:19

标签: c++ string

大家好,我正在研究以下列方式操作任何字符串的函数。

“abc” - > “CAB”

“abcd” - > “DACB”

“abcdef” - > “faebdc”

“divergenta” - > “adtinveerg”

......等等。

这是我到目前为止提出的代码。我认为它完成了这项工作,但我认为代码和解决方案有点难看,我不确定它是否是失败证明,以及它是否适用于每个给定的案例。我非常感谢有关此代码的任何输入或有关如何编写此函数的任何示例。我请求你记住,我非常喜欢n00b,所以不要对我强硬

string transformer(string input) {

string temp;
int n = 0;
int m = (input.length() -1);

for( int i = 0; i < input.length(); i++) {

    temp += input[m];

    if (input[m] == input[n]) {
        break;
    }

    else {
        temp += input[n];
    }

    n += 1;
    m -= 1;

    if ( temp.length() == input.length() ) {
        break;
    }
}
return temp; }

6 个答案:

答案 0 :(得分:2)

你有三个问题。

尝试使用“abbba”。如果结果不是你想要的,那么这个条件:

if (input[m] == input[n]) {
break;
}

是完全错误的。

看另一个条件:

if ( temp.length() == input.length() ) {
  break;
}

您一次向temp添加两个字符。如果input有奇怪的长度怎么办?

假设工作正常。考虑循环:

for( int i = 0; i < input.length(); i++) {

...

  if ( temp.length() == input.length() ) {
    break;
  }
}

该循环永远不会for语句中终止。你也可以这样做:

while( temp.length() < input.length() ) {
...
}

一旦这些都正常工作,你应该研究迭代器。

答案 1 :(得分:1)

std::string transformer(const std::string& input) {

    std::string res(input.length(), '0');

    for (int i = 0; i < input.length(); ++i) {
        res[i] = input[ i % 2 == 0 ? input.length() - (i/2) - 1 : (i/2) ];
    }

    return res;
}

答案 2 :(得分:1)

这个功能只是向中心走两个指数,直到它们相遇或相互通过。最后一个if块处理奇数长度输入字符串的情况。它适用于ideone.com

上的所有测试用例
std::string transformer(const std::string& input)
{
    std::string temp;
    int i = 0;
    int j = input.length() - 1;

    while (i < j) {
        temp += input[j--];
        temp += input[i++];
    }
    if (i == j) {
        temp += input[i];
    }
    return temp;
}

答案 3 :(得分:0)

不幸的是if (input[m] == input[n])会确保如果第一个和最后一个字符相同,它会在处理完第一个字符后立即退出。

答案 4 :(得分:0)

我会使用std::string::iteratorstd::string::reverse_iterator

执行此操作
auto it = input.begin();
auto rit = input.rbegin();
std::string temp;

for (size_t i = 0; i < input.length()/2; ++i) {
    temp += *rit++;
    temp += *it++;
}

处理空和奇数输入的逻辑留给你做,不应该太难。 (长度1的输入也是一种特殊情况)

答案 5 :(得分:0)

我会使用指针代替索引来执行此操作。

所以你有一个指针读取边缘,并且每次迭代时都要交换它们。

它也会让它更快。

我认为这应该可行,但我不记得如何创建一个const char指针数组。任何人都可以帮助我完成这一步吗?

string transformer(string input) {

     std::string temp;

     const char *front, *back;

     for (*front = input.c_str(), *back = front + input.length() - 1; front < back ; front++, back--) {
        temp += *back;
        temp += *front;
     }

     if (front == back)
        temp += *front;


     return temp;

}

(使用与@Blastfurnace相同的方法,但跳过不必要的索引。)