【问题标题】:Why is the memory limit getting exceeded?为什么超出内存限制?
【发布时间】:2021-09-24 08:46:21
【问题描述】:
#include <iostream>
using namespace std;
int main() 
{
    string a, b;
    int buffer;
    cin >> a >> b;
    for (int i = 0; i < a.size(); i++) 
    {
        if (a[i] < 92)
        {
            a[i] += 32;
        }
        if (b[i] < 92)
        {
            b[i] += 32;
        }
    }
    if (a < b) 
    {
        cout << -1;
    } 
    else if (a > b)
    {
        cout << 1;
    } 
    else if (a == b) 
    {
        cout << 0;
    }
    cin>>buffer;
    return 0;
}

已超出内存限制,使用的内存为:262100 KB

期望的输出:如果第一个字符串小于第二个,打印“-1”。如果第二个字符串小于第一个字符串,则打印“1”。如果字符串相等,则打印“0”。请注意,比较字符串时不考虑字母的大小写。

【问题讨论】:

  • 输入的最大时长是多少?是否保证第二个字符串总是比第一个字符串长或等长?
  • 它可能不会改变任何东西,但你忘了#include &lt;string&gt;
  • 还有什么是内存限制?
  • 只是从神奇的数字中猜测,但似乎std::tolower 会是更合适的选择。
  • 附带说明:根据您的操作系统和编译器,您可能拥有strcasecmp,因此您只需要cout &lt;&lt; strcasecmp(a.c_str(), b.c_str());linux.die.net/man/3/strcasecmp

标签: c++ memory-limit


【解决方案1】:

b 的字符数少于a 时,您将超出范围:

for (int i = 0; i < a.size(); i++) 
{
    if (a[i] < 92)
    {
        a[i] += 32;
    }
    if (b[i] < 92)   // <<----- here !
    {
        b[i] += 32;  
    }
}

b[i] += 32i &gt;= b.size() 时的未定义行为。您应该分别转换这两个字符串。我认为没有办法让你的代码使用更少的内存,所以这不应该是问题。尽管存在未定义的行为,但任何事情都可能发生。

【讨论】:

  • 同时转换两者是一种(可能被误导的)优化。如果ba长,则b的尾部不用调整;如果直到a 长度的所有字符都相等,则ba 之后。问题出在循环限制中:它应该是std::min(a.length(), b.length()),因为这个答案描述的原因。 +1。
  • @PeteBecker 非常好,尽管让我们保持简单。先搞清楚为什么错了,OP还是可以改进的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-24
相关资源
最近更新 更多