1. 问题

231. Power of Two: 判断一个整数是否是2的n次方,其中n是非负整数

342. Power of Four: 判断一个整数是否是4的n次方,其中n是非负整数

326. Power of Three: 判断一个整数是否是3的n次方,其中n是非负整数

2. 思路

1)2的n次方 

不妨列举几个满足条件的例子。

If n = 0: 2 ^ n = 1

If n = 1: 2 ^ n = 2 -> 10(二进制表示)

If n = 2: 2 ^ n = 4 -> 100(二进制表示)

If n =3: 2 ^ n = 8 -> 1000 (二进制表示)

...

If n = k, 2^n -> 100 .(k个0).. 000 (二进制表示)

可以看到,所有的2的n次方数,都以1开头,然后跟随了n个0。因此,对应的2 ^ n - 1是:

n=1: 2^1 - 1 = 0

If n = 1: 2 ^ n - 1 = 1 -> (0)1(二进制表示)

If n = 2: 2 ^ n - 1 = 3 -> (0)11(二进制表示)

If n =3: 2 ^ n - 1 = 7 -> (0)111 (二进制表示)

...

If n = k, 2^n-1 -> (0)11 .(k个1).. 111 (二进制表示)

最终代码只需要一行就可以解决:

class Solution {
public:
bool isPowerOfTwo(int num) {
return !(num&(num-1)) && n >= 1;
}
};

  

2)4的n次方

  • 解法1:

我觉得这道题跟2的n次方是有点像的。唯一的不同是需要解决属于2的n次方但不属于4的n次方的部分。

$A = \{x \mid 2^n = x \ for \ some \ n \in \ \mathbb{N} \}$

$B = \{x \mid \exists n \in \ \mathbb{N}, \forall m \in \mathbb{N} \Rightarrow 2^n = x \ and \ 4^m \ne x  \}$

先观察属于2的n次方但不属于4的n次方的部分。

2 -> 10

8 -> 1000

32 -> 100000

128 -> 10000000

再观察属于4的n次方的部分。

1 -> 1

4 -> 10

16 -> 10000

64 -> 1000000

可以看到,他们唯一的不同就是从右往左数的第2,4,6,8, ... , 2m位上有没有1。

代码:

class Solution {
public:
bool isPowerOfFour(int n) {
return (!(n&(n-1))) && n >= 1 && n==(n&0x55555555);
}
};
  • 解法(Solution) 2:

简单来说,所有4的n次方减去1都可以被3整除,但所有属于2的次n方而不属于4的n次方的数减去一都不可以被3整除。部分证明(需要用到离散数学)如下:

证明1:对任意 $x \in C=A-B$ 有 (x - 1) % 3 = 0.

$4^n=(1+3)^n = C^0_n 1+C^1_n3+...+C^n_n 3^n = 1+3(C^1_n + C^2_n 3 +...+ C^n_n 3^{n-1})$

$(C^1_n + C^2_n 3 +...+ C^n_n 3^{n-1}) \in \mathbb{Z} $

$\therefore (4^n -1)\ (mod\ 3) ≡ 0$

证明2:对任意$ y \in A$, 有 (x - 1) % 3 =1.

定理:$ if \ a_1 ≡ b_1( mod\ m),\ a_2 ≡ b_2( mod\ m) ,\ then \ a_1 * a_2 ≡ b_1 * b_2(mod m)$

$ 2^2 (mod\ 3)≡ 1,\ 2^1(mod\ 3)≡2$

$\therefore 2^3(mod\ 3) ≡ 2^1 * 2^2 (mod\ 3)≡ 2*1 ≡ 2$

$\therefore 2^5(mod\ 3) ≡ 2^3 * 2^2 (mod\ 3)≡ 2*1≡ 2 \\ ... \\ \therefore 2^{2k+1} (mod \ 3) ≡ (2^{2k-1} (mod \  3))*(2^2 (mod\ 3)) ≡ 2 \ne 0$

定理:$ if\ a_1 ≡ b_1( mod\ m),\ a_2 ≡ b_2( mod\ m) ,\ then \ a_1 - a_2 ≡ b_1 - b_2(mod\ m)$

$\therefore 2^{2k+1} -1(mod\ 3) ≡ 1\ne 0$

代码Code:

class Solution {
public:
bool isPowerOfFour(int n) {
return (!(n&(n-1))) && n >= 1 && (n-1)%3 == 0;
}
};

  

3)3的n次方

简单来说,如果一个数可以整除3的k次方,那么这个数必然也是3的n次方数(其中n<k)。学过离散数学的可以联想到:

已知对于任意的一个正整数N,有$N=p_1^{e1}p^{e2}_2...p^{er}_r$ 且$p_1、p_2...p_r$都为素数。而3是一个素数。因此:
$\forall n, m\in \mathbb{N}$
$n<m\ and \ \exists k\in \mathbb{N}, such\ that\ m=3^k$
$if\ m(mod\ n)≡0,\ then\ there\ must\ be \ n = 3^l \ for \ some \ l\in \mathbb{N}$

代码如下:

class Solution {
public:
bool isPowerOfThree(int n) {
return n > 0 and int(pow(3,19)) % n == 0;
}
};

 

类似的,因为2也是个素数,那么对于2的n次方也可以用相似的方法求解:

class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && (int(pow(2,30))) % n == 0; }
};

  

LeetCode - 326, 342, 231 Power of Three, Four, and Two的更多相关文章

  1. LeetCode 第 342 题(Power of Four)

    LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether ...

  2. 【leetcode❤python】231. Power of Two

    #-*- coding: UTF-8 -*- class Solution(object):    def isPowerOfTwo(self, n):        if(n<=0):     ...

  3. [LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four

    这三道题目都是一个意思,就是判断一个数是否为2/3/4的幂,这几道题里面有通用的方法,也有各自的方法,我会分别讨论讨论. 原题地址:231 Power of Two:https://leetcode. ...

  4. 【一天一道LeetCode】#342. Power of Four

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  5. 231. Power of Two 342. Power of Four -- 判断是否为2、4的整数次幂

    231. Power of Two Given an integer, write a function to determine if it is a power of two. class Sol ...

  6. leetcode 326. Power of Three(不用循环或递归)

    leetcode 326. Power of Three(不用循环或递归) Given an integer, write a function to determine if it is a pow ...

  7. LeetCode 第 342 题(Power of Four)

    LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether ...

  8. [LeetCode] 231. Power of Two 2的次方数

    Given an integer, write a function to determine if it is a power of two. Example 1: Input: 1 Output: ...

  9. Leetcode 232 Implement Queue using Stacks 和 231 Power of Two

    1. 232 Implement Queue using Stacks 1.1 问题描写叙述 使用栈模拟实现队列.模拟实现例如以下操作: push(x). 将元素x放入队尾. pop(). 移除队首元 ...

随机推荐

  1. 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)(Finchley版本)

    转载请标明出处: 原文首发于:>https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f9-sleuth/ 本文出自方志朋的博客 这篇文章主 ...

  2. sql中UNION和UNION ALL的区别

    写sql时我们经常会遇到需要把从多张表查询的集果集进行合并.这时就用到了union.使用union或union all 时一定要保证查询的列的一致性 .不然sql会报错.字段不一致的话可以用单引号来占 ...

  3. 个人免签收款接口 bufpay.com 支持限额设置

    有产品希望收款分布到不同的手机,每个当手机达到某一限额以后就停止改手机的收款. bufpay.com 近期上线了收款限额设置功能,配置界面如下图: 每个手机微信或支付宝可以单独设置每日限额,如果该手机 ...

  4. LeetCode 中级 - 组合总和(105)

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  5. linux 网络服务之一

  6.  linux命令sed与awk是干什么用的,怎么用?

    非常强大的文本操纵工具,sed,awk,grep 这个三个命令 都是操作文本文件的unix系统有几个非常命令的特点:1. 对于内核而言,unix文件都是字节序列.io设备也是文件.2. 至于文件的含义 ...

  7. jQuery获取Select option 选择的Text和 Value

    获取一组radio被选中项的值:var item = $('input[name=items][checked]').val();获取select被选中项的文本var item = $("s ...

  8. linux 操作系统下简单的命令行操作

    一: 配置linux 操作系统虚拟主机 首先安装一个虚拟机(百度上面有很多哦) , 我主要使用的是VMware workstation 然后 下载一个centos镜像6..5到7都可以; 然后用VMw ...

  9. 【Android】Android Studio真机调试的问题统整

    真机调试需要注意以下几个问题 [1]手机的USB调试需开启 [2]手机不能是仅充电模式,需要传输数据模式 [3]有些USB线会偷工减料,请拿一条没问题的线,例如买手机时原厂给的配线 [4]在PC端需要 ...

  10. Leecode刷题之旅-C语言/python-349两个数组的交集

    /* * @lc app=leetcode.cn id=349 lang=c * * [349] 两个数组的交集 * * https://leetcode-cn.com/problems/inters ...