手撕算法稳过的技巧7-看懂题目

23 阅读2分钟

要点说明

返璞归真的说,没看清楚题目这种错误过于低级,但是却难免犯错。

哪怕一道很简单的题目,也一定要先读懂题目。

我以一道很简单的题目来说明这种错误可能有多幼稚。如果没看清题目,或者思路陷入死胡同,一定会翻车的!!!

我建议,先看题目,推演一遍,再次确认一下题目是不是看清楚了,再次推演。

至少看题目两次,推演两次。

我使用一个题目来说明这种幼稚的错误怎么发生的。

题目 3 的幂

  • [326] 3 的幂

  • leetcode.cn/problems/po…

  • 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;
    }
};