使用逻辑运算符避免大量的判断语句

背景

今天在力扣刷算法题目的时候,看到了一条评级为简单的算法,于是打算一鼓作气快速地搞定它,最后虽然通过它的错误提示完成了这个算法要求,但是书写的代码又臭又长(可能很多人都会面临这样的问题吧)。主要就是条件判断语句的出现次数太多了。后来看了官方的解题思路,才发现逻辑运算可以避免大量的条件判断。上菜!

算法要求

种花问题

假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。
给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。

略加思索后,我写出来的代码是这样的:

class Solution {
    
    
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
    
    
    	// 当数组的长度是1时且为0则返回true
        if (flowerbed.length == 1 && flowerbed[0] == 0)
            return true;
        else {
    
    
        	// 遍历这个数组
            for (int i = 0; i < flowerbed.length; i++) {
    
    
            	// 判断当数组长度为2的时候
                if (i == 0){
    
    
                    if (flowerbed[0] == 0 && flowerbed[1] == 0) {
    
    
                        flowerbed[i] = 1; 
                        n --;
                    }
                    continue;
                }
                // 当遍历到最后一个元素的时候
                if (i == flowerbed.length - 1){
    
    
                    if (flowerbed[i] == 0 && flowerbed[i-1] == 0) {
    
    
                        flowerbed[i] = 1; 
                        n --;
                    } 
                    continue;
                }
                // 中间位置的判断
                if (flowerbed[i] != 1 && flowerbed[i+1] != 1 && flowerbed[i-1] != 1) {
    
    
                    flowerbed[i] = 1; 
                    n --;
                }
        }
        }
        if (n <= 0) return true;
        return false;
    }
}

可以看到,上面的程序中用到了4次的条件判断。这便显得代码十分臃肿。看看官方的解题是怎么样的:

public class Solution {
    
    
    public boolean canPlaceFlowers(int[] flowerbed, int n) {
    
    
        int i = 0, count = 0;
        while (i < flowerbed.length) {
    
    
        	// 这行逻辑运算就把上面的四个条件判断包含在了其中
            if (flowerbed[i] == 0 && (i == 0 || flowerbed[i - 1] == 0) && (i == flowerbed.length - 1 || flowerbed[i + 1] == 0)) {
    
    
                flowerbed[i++] = 1;
                count++;
            }
             if(count>=n)
                return true;
            i++;
        }
        return false;
    }
}

分析上面的程序,看到它之用了一个判断语句就把我写的四个判断语句合并了。这是怎么做到的呢?主要是抓住了或运算的特点——当或运算第一个条件成立的时候,第二个条件就不会执行。这样的话,我们就不用额外的加上判断语句来避免数组越界的问题了。
精妙。

猜你喜欢

转载自blog.csdn.net/weixin_43967401/article/details/110524337