当转换为三元运算符时,java条件改变了行为?

fiei3ece  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(302)

我正在编写一个函数,它比较字符串前半部分的元音数,并将其与后半部分进行比较,然后根据数字是否相等返回一个布尔值。
例子:

Input: "book"
Output: true

因为 bo | ok , numVowels = 1 两半各一个“o”。
我的代码在这里

class Solution {
    public boolean halvesAreAlike(String s) {
        Set<Character> set = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U'));                                
        int vowelCount = 0, length = (s.length()%2 == 0) ? s.length()/2 : s.length()/2+1;

        boolean pastHalf = false; 
        for (int i = 0; i < s.length(); i++) {
            if (i == length) pastHalf = true; 
            if (pastHalf && set.contains(s.charAt(i))) vowelCount--; 
            else if (!pastHalf && set.contains(s.charAt(i))) vowelCount++; 
        }
        return vowelCount == 0;                                                                    
    }
}

if (i == length) pastHalf = true; 线,我正在检查我是否击中了线的中间。这是一个简单的布尔值。我把它改成这个 pastHalf = (i == length) ? true : false; 测试用例的输出是错误的 Ieai . 有人知道为什么吗?我相信这些说法是等价的。

xwmevbvl

xwmevbvl1#

if (i == length) pastHalf = true;

绝对不一样

pastHalf = (i == length) ? true : false

在第一种情况下, pastHalf 只有当 i 完全等于 length ,所以当您在 length , pastHalf 遗骸 true .
在第二种情况下,每次迭代 pastHalf 重置了,所以 pastHalf 只有当 i 完全等于 length .
其他改进:

length = (s.length()+1) % 2;  // Think about this one carefully

if (set.contains(s.charAt(i))) 
    vowelCount += pastHalf ? -1 : +1;

相关问题