首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回str与str.substr(0,str.size())在leetcode中给出不同的输出

返回str与str.substr(0,str.size())在leetcode中给出不同的输出
EN

Stack Overflow用户
提问于 2020-01-31 19:23:57
回答 1查看 63关注 0票数 0

我刚解决了https://leetcode.com/problems/push-dominoes/

我的代码是

代码语言:javascript
复制
class Solution {
public:

    string pushDominoes(string dominoes) {
        string res(dominoes.size(), ' ');
        dominoes = 'L' + dominoes + 'R';

        int l = 0;
        for(int r = 1; r < dominoes.size(); r++)
        {
            if(dominoes[r] != '.')
            {
                //check which case we have [L...R], [R....L] [L.....L]  [R...R]
                if(l != 0) res[l-1] = dominoes[l]; 
                if(r != dominoes.size() - 1) res[r-1] = dominoes[r];

                if(dominoes[l] == dominoes[r])
                {
                    for(int i = l; i <= r; i++) 
                        if(i > 0) res[i-1] = dominoes[r];
                }
                else if(dominoes[l] == 'L' && dominoes[r] == 'R')
                    for(int i = l+1; i < r; i++) res[i-1] = '.';
                else if(dominoes[l] == 'R' && dominoes[r] == 'L')
                {
                    if((l+r)%2 == 0) 
                    {
                        auto mid = (l+r)/2;
                        res[mid-1] = '.';
                        for(int i = l+1; i < mid; i++) res[i-1] = 'R';
                        for(int i = mid+1; i < r; i++) res[i-1] = 'L';
                    }
                    else
                    {
                        auto mid = (l+r)/2;
                        for(int i = l+1; i <= mid; i++) res[i-1] = 'R';
                        for(int i = mid+1; i < r; i++) res[i-1] = 'L';
                    }
                }

                l = r;
            }
        }

        return res;
        // return res.substr(0, res.size());
    }
};

int main( ) 
{ 
   Solution soln;

   cout << soln.pushDominoes(".L.R.") << endl;
}

对于其中一个测试用例,输入为“.L.R”。leetcode声明我的输出是"LL.RRRLLRRLL..“当我使用return res时。答案应该是"LL.RR“。但是我打印出了res,它确实是"LL.RR“和5码。

如果我将代码更改为返回return res.substr(0, res.size())而不是return res,则得到正确的解决方案。当这两个返回语句应该是相同的时候,为什么会出现这种情况呢?

我还将代码移植到计算机上,并在计算机上编译,得到了正确的解决方案。这让我想知道在不同的C++编译器之间我的代码是如何处理的,还是Leetcode可能对这个特定的问题有一些问题。有什么建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 20:52:55

代码语言:javascript
复制
string res(dominoes.size(), ' ');

res的大小设置为dominoes的大小,此大小永远不会更改。res绝不能比dominoes大。输入".L.R.",dominoes的长度为5,res为5。

代码语言:javascript
复制
dominoes = 'L' + dominoes + 'R';

dominoes的大小更改为7。

代码语言:javascript
复制
for (int r = 1; r < dominoes.size(); r++)

r从1迭代到6。

旁白:当我在<=循环中看到一个for时,我会停下来看更长的时间。它错得远比对的多。

在这种情况下,这似乎是错误的,允许

代码语言:javascript
复制
for (int i = l; i <= r; i++)
    if (i > 0) res[i - 1] = dominoes[r];

il迭代到r。因为r可以是6,i可以是6。

代码语言:javascript
复制
    if (6 > 0) res[6 - 1] = dominoes[6];

是有可能的。这决定了

代码语言:javascript
复制
    res[5] = dominoes[6];

res[5]无效。在那里编写代码会调用未定义的行为,在本例中,它似乎覆盖了支持string的c样式字符串的空终止符。

另外:避免使用l作为变量名。它看起来太像1,并导致错误或误读代码。

要解决这个问题,您可以将if (i > 0)的逻辑扩展到if (i > 0 && i-1 < res.size())中,以过滤掉这个问题,但是最好是重新工作或替换算法,这样您就不会发现自己处于这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60010066

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档