我试图理解给出的问题here http://qa.geeksforgeeks.org/4118/find-the-minimum-number-switches-you-have-press-turn-all-bulbs及其解决方案:
问题指出:
N个灯泡用电线连接起来。每个灯泡都有一个与之关联的开关,但是由于接线错误,开关也会更改当前灯泡右侧所有灯泡的状态。给定所有灯泡的初始状态,找到打开所有灯泡所需按下的最少开关数量。您可以多次按下同一个开关。
注:0 代表灯泡关闭,1 代表灯泡开启。
Example:
Input : [0 1 0 1]
Return : 4
Explanation :
press switch 0 : [1 0 1 0]
press switch 1 : [1 1 0 1]
press switch 2 : [1 1 1 0]
press switch 3 : [1 1 1 1]
给出的答案之一是:
int solve(int A[], int N) {
int state= 0, ans = 0;
for (int i = 0; i < N;i++) {
if (A[i] == state) {
ans++;
state = 1 - state;
}
}
return ans;
}
我似乎无法理解 if 语句如何做正确的事情。
每当我们翻转开关时,我们都会向右翻转所有开关,因此,如果我们正在搜索 0(关闭开关),现在我们需要搜索 1(打开开关),因为我们已将所有开关向右翻转,让我们看看一个例子 :
0 1 1 0,现在初始状态 = 0,当我们遇到第一个灯泡时,我们翻转所有开关,即 1 0 0 1 但在数组中值仍然是 0 1 1 0,所以我们需要能够识别出由于之前的翻转,第二个索引处的灯泡被关闭,因此我们将状态更改为 1 - 状态,这使得我们正在寻找的状态为 1,类似地,翻转开关会更改我们要查找的下一个状态的标准。会搜索。
下面我写了一段代码,这样会更容易理解
bool flipped = false;
int ans = 0;
for(int i = 0;i < N;i++){
if(flipped == false){
if(A[i] == 0){
ans++;
flipped = true;
}
}else if(flipped == true){
if(A[i] == 1){
ans++;
flipped = false;
}
}
}
这里我使用翻转变量来告诉灯泡是否被翻转,如果它们被翻转,那么我们将搜索 1(打开开关),因为实际上由于之前的翻转,它们是 0(关闭)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)