写程序还真的是一个对逻辑要求很高很高的工作。
就拿if判断语句来说,什么时候第二个判断语句可以用if,什么时候必须用else if都是需要在逻辑上下功夫的。
比如这个题:链接:https://www.nowcoder.com/questionTerminal/4345e55fdb03498a89a97ec18e62b3ab
来源:牛客网
Given an array with n objects colored red, white or blue, sort them so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note:
You are not suppose to use the library's sort function for this problem.
一种比较好的算法是:设置red==0,blue==n-1,令i==0,从第i(0)个数开始,如果这个数是0,就把它和A[red]交换,并且red++,i++;如果这个数是2,就把它和A[blue]交换,并且blue--,不+i是因为和后面的数交换之后,后面的数之前还没有做过判断,所以需要在下个循环重新判断一次;如果这个数是1,那么i++。
但是我的程序总是出问题:
class Solution {
public:
void sortColors(int A[], int n) {
int red=0,blue=n-1;
int i=0;
int temp;
while (i<blue+1) {
if (A[i]==0) {
temp=A[i];
A[i]=A[red];
A[red]=temp;
i++;
red++;
}
if (A[i]==2) {
temp=A[i];
A[i]=A[blue];
A[blue]=temp;
blue--;
}
if (A[i]==1) i++;
}
}
};
就是总是和正确答案有偏差。分析发现是因为第二个if和第三个if前没有加else。如果没有else,那么比如一个元素是0,在执行了第一个if括号里的语句之后,程序会继续执行第二个if括号里的语句,此时i已经加了1,因此判断的元素已经不是本来那个元素了,自然很容易出错。因此
class Solution {
public:
void sortColors(int A[], int n) {
int red=0,blue=n-1;
int i=0;
int temp;
while (i<blue+1) {
if (A[i]==0) {
temp=A[i];
A[i]=A[red];
A[red]=temp;
i++;
red++;
}
else if (A[i]==2) {
temp=A[i];
A[i]=A[blue];
A[blue]=temp;
blue--;
}
else i++;
}
}
};
才是正确的。
还有一道题
链接:https://www.nowcoder.com/questionTerminal/9a9e74b71f944efab9992925f7f9a65e
来源:牛客网
Given two binary trees, write a function to check if they are equal or not.
Two binary trees are considered equal if they are structurally identical and the nodes have the same value.
我看一个人的答案是这样的我觉得这个题第二个if前面是要加else的,可是它怎么就可以通过呢?如果p和q都为null岂不是也满足条件?稍微想了一下才发现,如果p和q都为null,就已经return true了,能走到第二个if说明不可能同时为null,因此这个或就代表p和q有且仅有一个为null,那么一定就会返回false。链接:https://www.nowcoder.com/questionTerminal/9a9e74b71f944efab9992925f7f9a65e 来源:牛客网 public class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if(p==null&&q==null) return true; if(p==null||q==null) return false; if(p.val!=q.val) return false; return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right); } }
很有意思啊!自己的逻辑还是需要再多加练习。