要点说明
返璞归真的说,没看清楚题目这种错误过于低级,但是却难免犯错。
哪怕一道很简单的题目,也一定要先读懂题目。
我以一道很简单的题目来说明这种错误可能有多幼稚。如果没看清题目,或者思路陷入死胡同,一定会翻车的!!!
我建议,先看题目,推演一遍,再次确认一下题目是不是看清楚了,再次推演。
至少看题目两次,推演两次。
我使用一个题目来说明这种幼稚的错误怎么发生的。
题目 3 的幂
-
[326] 3 的幂
-
algorithms
-
Easy (53.55%)
-
Likes: 378
-
Dislikes: 0
-
Total Accepted: 309K
-
Total Submissions: 577.1K
-
Testcase Example: '27'
-
给定一个整数,写一个函数来判断它是否是 3 的幂次方。如果是,返回 true ;否则,返回 false 。
-
整数 n 是 3 的幂次方需满足:存在整数 x 使得 n == 3^x
-
示例 1:
-
输入:n = 27
-
输出:true
-
示例 2:
-
输入:n = 0
-
输出:false
-
0 0
-
示例 3:
-
输入:n = 9
-
输出:true
-
示例 4:
-
输入:n = 45
-
输出:false
-
45 15 5
-
提示:
-
-2^31 <= n <= 2^31 - 1
-
进阶:你能不使用循环或者递归来完成本题吗?
错误的行动
我先开始推演
- 27 9 3 1
- 9 3 1
- -9 -3 -1
如果n < 0, 我应该怎么办? 我把题目当成了判断一个数字能否被3整除了!!!这是下意识的判断
我在想,如果 n == -2^31 怎么办?然后我还想,要把 n 转成更大的 64位的!!
实际上,我忘记了题目的要求 写一个函数来判断它是否是 3 的幂次方。如果是,返回 true。实际上,3的幂次方不可能小于0的,可以想象那个指数曲线。
正确的解法
class Solution {
public:
bool isPowerOfThree(int n) {
if(n < 0) return false;
int dividor = 3;
while(n > 1){
if(n % 3 == 0){
n /= 3;
}else{
return false;
}
}
return n == 1;
}
};