【问题标题】:Recursively reversing a string without parameters递归地反转没有参数的字符串
【发布时间】:2020-05-21 16:33:59
【问题描述】:

我得到了一个 smartReverse 类,它包含一个成员数据,它是一个名为 str 的字符串。我必须实现一个成员方法(没有任何类型的辅助函数,它不带参数并返回 str 的反转版本。

到目前为止,这是我的尝试,但这只是将第一个字符发送到字符串的末尾。从这一点来看,我很无知。我知道如何使用辅助函数来执行此操作,但不允许在此处使用它们。

string smartReverse::rev_recursive() const
{
        if (str.length() <= 1)
                return str;
        char first_char = str[0];
        smartReverse* remainder = new smartReverse(str.substr(1));
        remainder->rev_recursive();
        return remainder->getString() + first_char;
}

【问题讨论】:

  • smartReverse* remainder = new smartReverse(str.substr(1)); 确实存在内存泄漏,它应该只是 smartReverse remainder(str.substr(1));
  • 你不使用remainder-&gt;rev_recursive();返回的值(与remainder-&gt;getString()不同)
  • 感谢你们两位,仍然掌握了内存管理的窍门,所以我肯定会解决这个问题。以及刚刚点击我必须只是因为沮丧而看了看。当我在某个地方安顿下来时,我会对退货进行更改,看看是否能解决我的问题
  • 避免新建/删除。反正你这里不需要它,只要使用 std::string 作为类型。
  • @Brennen Green 不清楚是需要反转作为字符串本身的数据成员,还是仅仅根据数据成员输出一个新的反转字符串。

标签: c++ string class recursion reverse


【解决方案1】:

删除 memleak 并使用 rev_recursive 结果,固定版本可能是:

std::string smartReverse::rev_recursive() const
{
    if (str.length() <= 1) {
        return str;
    }
    char first_char = str[0];
    smartReverse remainder(str.substr(1));
    return remainder.rev_recursive() + first_char;
}

【讨论】:

    【解决方案2】:

    没有必要动态分配 std::string 类型的对象。这只是个坏主意。

    我不知道 smartReverse 类的外观如何,但这是它的简化版本,它只有一个成员函数 rev_recursive 可以反转存储的字符串。

    #include <iostream>
    #include <string>
    
    class smartReverse
    {
    public:
        smartReverse( const std::string &s ) : s( s ) {}
    
        std::string rev_recursive() 
        {
            if ( s.size() < 2 ) return s;
    
            char first = s.front(), last = s.back();
    
            s = s.substr( 1, s.size() - 2 );
            return s = last + rev_recursive() + first;
        }
    private:
        std::string s;
    };  
    
    int main() 
    {
        smartReverse obj( "Hello Brennen Green" );
    
        std::cout << obj.rev_recursive() << '\n';
    
        return 0;
    }
    

    程序输出是

    neerG nennerB olleH
    

    如果函数应该是一个常量成员函数,那么它的实现可以如下所示

    #include <iostream>
    #include <string>
    
    class smartReverse
    {
    public:
        smartReverse( const std::string &s ) : s( s ) {}
    
        std::string getString() const
        {
            return s;
        }
    
        std::string rev_recursive() const
        {
            if ( s.size() < 2 ) return s;
    
            char first = s.front(), last = s.back();
    
            return last + smartReverse( s.substr( 1, s.size() - 2 ) ).rev_recursive() + first;
        }
    
    private:
        std::string s;
    };  
    
    int main() 
    {
        smartReverse obj( "Hello Brennen Green" );
    
        std::cout << obj.getString() << '\n';
        std::cout << obj.rev_recursive() << '\n';
    
        return 0;
    }
    

    程序输出是

    Hello Brennen Green
    neerG nennerB olleH
    

    请注意,使用的方法比仅从字符串开头删除一个字符然后附加到末尾的方法更有效,因为在使用的方法中,递归次数小于或等于s.size() / 2的原始字符串。

    【讨论】:

      猜你喜欢
      • 2014-06-10
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2020-07-09
      • 2013-09-27
      相关资源
      最近更新 更多