当我最近在hackerearth上练习时,我在解决这个问题时发现了一个有趣的问题:https://www.hackerearth.com/practice/basic-programming/implementation/basics-of-implementation/practice-problems/algorithm/magical-tree/
我用C ++解决了它。
码:
#include<iostream>
using namespace std;
int main()
{
int l;
cin>>l;
int lInitial=l;
int max;
while(l--)
{
string s;
cin>>s;
int v1=((int)s[0]-48),v2=0;
for(int i=1;i<s.length()-1;)
{
v2=(int)s[i+1]-48;
if(s[i]=='-')
v2=-1*v2;
v1=v1+v2;
i=i+2;
}
if(l==lInitial)
max=v1;
else
max=v1>max? v1 : max;
}
cout<<max<<endl;
}
对于给定的输入:
4
8-6+2+4+3-6+1
1+1+1+1
2+3+6+8-9
2+7+1-6
产量为:4197440
一旦我在初始化期间将max声明为零
int max=0;
我得到了所需的输出:10
有人可以解释为什么这种不一致存在,即使我确保在第一次循环执行变量max将采用第一个案例值v1,如下所示。
if(l==lInitial)
max=v1;
else
max=v1>max? v1 : max;
我使用了他们网站上提供的代码编辑器。选择的语言是C ++(g ++ 5.4.0)谢谢:)
因为在这一点:
if(l==lInitial)
max=v1;
else
max=v1>max? v1 : max;
如果l
不等于lInitial
,它将执行以下行:
max=v1>max? v1 : max;
这里的问题是你将v1
与尚未初始化的max
进行比较。所以这是偶然的机会,如果这是真的。如果是真的,它将设置max=v1
。但是,如果不是,它将设置max=max
。所以它将保持与之前相同的未初始化价值。
单位化值很可能远高于您输入中的任何值,因此它总是会占用任何值。
问题是while(l--)
使用l
的旧值来决定是否继续循环,然后在进入循环之前减少l
。因此,第一次通过循环,l
将是lInitial - 1
,你不会触发if
的初始化分支。
表达式l--
复制l
的值,递减l
并返回复制的值。在第一个循环之前,l
的值等于lInitial
。进入第一个循环后,执行语句l--
,因此在第一个循环期间,l
的值等于lInitial-1
。因此,在第一个循环中,条件l==lInitial
为假。
修复代码的一种方法是将lInitial的初始化更改为int lInitial=l-1;
。但是,这会使你的代码“丑陋”,因为lInitial
现在实际上并不包含l
的初始值。
另一种方法是将if条件l==lInitial
更改为l==lInitial-1
。