我刚解决了https://leetcode.com/problems/push-dominoes/。
我的代码是
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可能对这个特定的问题有一些问题。有什么建议吗?
发布于 2020-01-31 20:52:55
string res(dominoes.size(), ' ');将res的大小设置为dominoes的大小,此大小永远不会更改。res绝不能比dominoes大。输入".L.R.",dominoes的长度为5,res为5。
dominoes = 'L' + dominoes + 'R';将dominoes的大小更改为7。
for (int r = 1; r < dominoes.size(); r++)将r从1迭代到6。
旁白:当我在<=循环中看到一个for时,我会停下来看更长的时间。它错得远比对的多。
在这种情况下,这似乎是错误的,允许
for (int i = l; i <= r; i++)
if (i > 0) res[i - 1] = dominoes[r];将i从l迭代到r。因为r可以是6,i可以是6。
if (6 > 0) res[6 - 1] = dominoes[6];是有可能的。这决定了
res[5] = dominoes[6];res[5]无效。在那里编写代码会调用未定义的行为,在本例中,它似乎覆盖了支持string的c样式字符串的空终止符。
另外:避免使用l作为变量名。它看起来太像1,并导致错误或误读代码。
要解决这个问题,您可以将if (i > 0)的逻辑扩展到if (i > 0 && i-1 < res.size())中,以过滤掉这个问题,但是最好是重新工作或替换算法,这样您就不会发现自己处于这种情况。
https://stackoverflow.com/questions/60010066
复制相似问题