0

大家好,我正在开发一个以以下方式操作任何字符串的函数。

“ABC”->“出租车”

“abcd”->“dacb”

“abcdef”->“faebdc”

“分歧”->“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; }
4

6 回答 6

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() ) {
...
}

一旦一切正常,您应该研究迭代器。

于 2012-07-11T16:09:30.723 回答
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;
}
于 2012-07-11T16:27:26.953 回答
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;
}
于 2012-07-11T16:16:39.480 回答
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 相同的方法,但跳过了不必要的索引。)

于 2012-07-11T16:29:04.220 回答
0

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

于 2012-07-11T16:08:37.643 回答
0

我会用std::string::iteratorand来做这个std::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的输入也是特例)

于 2012-07-11T16:17:17.903 回答