LeetCode - 326, 342, 231 Power of Three, Four, and Two
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的更多相关文章
- LeetCode 第 342 题(Power of Four)
LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether ...
- 【leetcode❤python】231. Power of Two
#-*- coding: UTF-8 -*- class Solution(object): def isPowerOfTwo(self, n): if(n<=0): ...
- [LeetCode] 231 Power of Two && 326 Power of Three && 342 Power of Four
这三道题目都是一个意思,就是判断一个数是否为2/3/4的幂,这几道题里面有通用的方法,也有各自的方法,我会分别讨论讨论. 原题地址:231 Power of Two:https://leetcode. ...
- 【一天一道LeetCode】#342. Power of Four
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 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 ...
- leetcode 326. Power of Three(不用循环或递归)
leetcode 326. Power of Three(不用循环或递归) Given an integer, write a function to determine if it is a pow ...
- LeetCode 第 342 题(Power of Four)
LeetCode 第 342 题(Power of Four) Given an integer (signed 32 bits), write a function to check whether ...
- [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: ...
- Leetcode 232 Implement Queue using Stacks 和 231 Power of Two
1. 232 Implement Queue using Stacks 1.1 问题描写叙述 使用栈模拟实现队列.模拟实现例如以下操作: push(x). 将元素x放入队尾. pop(). 移除队首元 ...
随机推荐
- 二、Shiro 认证开发
I.java开发 环境准备 <dependencies> <dependency> <groupId>junit</groupId> <artif ...
- js的垃圾回收机制
Js具有自动垃圾回收机制.垃圾收集器会按照固定的时间间隔周期性的执行. JS中最常见的垃圾回收方式是标记清除. 工作原理:是当变量进入环境时,将这个变量标记为“进入环境”.当变量离开环境时,则将其标记 ...
- MVC进行多文件上传
用mvc做多文件的上传和保存到本地,大致流程就是,前台通过form表单提交多文件,Controller接受到文件流,将文件流保存到本地 然后将保存地址 存到数据库中. 将文件通过from提交 < ...
- 【模板】负环(spfa)
题目描述 暴力枚举/SPFA/Bellman-ford/奇怪的贪心/超神搜索 输入输出格式 输入格式: 第一行一个正整数T表示数据组数,对于每组数据: 第一行两个正整数N M,表示图有N个顶点,M条边 ...
- 【小尝试】Java获取慕课网原有路径课程列表
作为一个老慕课网(https://www.imooc.com/)粉丝,还记得最开始的慕课网有很多免费的路径课程,练习什么的也特别详细,是入门一门语言的好方法. 现在慕课网发展起来了收费模式,添加了很多 ...
- JavaScript 时间对象 date()
getYear() 获得的是距离1900年过了多少年 var d = new Date(); document.write(d+"<br />"); document. ...
- core dump文件分析和调试
core介绍 当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成"核心转储").我们可以认 ...
- python学习笔记:第19天 类的约束、异常、MD5和logging
目录 一.类的约束 二.异常处理: 三.MD5加密 四.日志(logging模块) 一.类的约束 真正写写项目的代码时都是多人协作的,所以有些地方需要约束程序的结构.也就是说,在分配任务之前就应该把功 ...
- arping命令用法
arping命令使用说明 BusyBox v1.17.3 (2011-07-20 17:01:30 CST) multi-call binary. Usage: arping [-fqbDUA] [- ...
- 《CURL技术知识教程》系列分享专栏
<CURL技术知识教程>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201737.html 文章 PHP采集相关教程之一 CUR ...