就时空复杂度而言,哪个更好?
if (!(N % 2 == 0) || N % 2 == 0 && (N >= 6 && N <= 20)) {
System.out.println("Weird");
}
if ( N % 2 == 0 && (N >= 2 && N <= 5 || N > 20)) {
System.out.println("Not Weird");
}
// OR
if (!(N % 2 == 0)) {
System.out.println("Weird");
} else {
if (N >= 2 && N <= 5) {
System.out.println("Not Weird");
} if (N >= 6 && N <= 20) {
System.out.println("Weird");
} if (N > 20) {
System.out.println("Not Weird");
}
}
我正在尝试查看在Java中创建if语句的最佳方法是使简单但直接的if语句(例如下面的语句(但有点混乱)或顶部的“整洁”语句)变得简单。每个小细节都会受到赞赏。
答案 0 :(得分:0)
这些是相同的。
只有在有循环的情况下Big-O才起作用,它们都在恒定的时间O(1)
中运行。
通常,避免嵌套。我个人更喜欢第一种选择。但实际上根本没有区别,尤其是由于短路:
如果在您的第一个示例中!(N % 2 == 0)
是true
,则||
将“短路”,这意味着由于找到了真相,因此不会评估其右半部分。这与第二个示例中的if语句相同。 &&
运算符也是如此-如果遇到单个false
值,他们就会“短路”,因为他们永远都无法以这种方式求真。
因此,从本质上讲,选择一个您喜欢的/逻辑上更具可读性/更连贯的。
答案 1 :(得分:0)
如前所述,两种情况的时空复杂度相同。这里的重要因素是理解代码的复杂性。这取决于具体情况下的个人判断。
我不确定我更喜欢哪个,因为我不了解奇怪的算法,而我的偏好取决于这两种表述对于有见识的读者有多“显而易见”-我假设接触此代码的人都知道它的含义意味着N很奇怪。
但是在第二种情况下,我希望比较少。如果一个子句处理N <= 5,则下一个替代方法不需要确保N> = 6。
因此(用伪代码)
else if (N <= 1) {
// no decision according to original code
} else if (N <= 5) {
print not weird
} else if (N <= 20) {
print weird
} else {
print not weird
}
是N还是怪异?然后,首先要求使用else
以避免重复计算,其次,您是要忽略零和负整数吗? (我从我的观点出发,我提出的布局清楚地表明我们在这种情况下不做任何事情,并且我为阐明清楚性而争论-预期的读者可能不得不怀疑这种明显的遗漏)>
还有,我在捡东西的时候
(!(N % 2 == 0))
通过将编写为更清晰
(N % 2 != 0)