leetcode 342
来源:互联网 发布:淘宝客服招聘上海 编辑:程序博客网 时间:2024/04/30 00:33
leetcode 342
题目
Given an integer (signed 32 bits), write a function to check whether it is a power of 4.
Example:
Given num = 16, return true. Given num = 5, return false.
Follow up: Could you solve it without loops/recursion?
Credits:
Special thanks to @yukuairoy for adding this problem and creating all test cases.
Subscribe to see which companies asked this question
大意就是如何判断一个数字是不是4的k次幂。进阶版本是如何使用非循环的方法来实现。
本文只介绍如何使用非循环的方式来实现。废话不多说,上代码。
实现
//leetcode 342 bool isPowerOfFour(int num) { if(num <= 0)return false; bitset<32> bits(num); //判断是否为2的幂 if(bits.count() != 1){return false;} else{ //判断奇数位是否是1 bits = num&0x55555555; return bits.count() == 1; } }
思路
首先小于等于0的数肯定不是4的幂,进行排除。
一个基本思路是首先判断这个数是不是2的幂,然后查看二进制下1的后面是否有偶数个0。
判断是否为2的幂的方法很简单,即查看二进制的数字是否存在且只存在1个1
eg:0000 0010
判断1后面是否存在偶数个0的方法为:num&0x55555555,即判断只有1个1,且其落在奇数位。
eg:0000 0010&0101 0101 = 0000 0000 ,0001 0000&0101 0101 = 0001 0000
拓展
bitset.count()的时间复杂度是什么呢?它会不会直接是一个循环的调用,导致我们写的这份代码只是一个想象中非常美好,却只是一坨X呢?
查看了一下OSX中的STL实现。
<bitset>template <size_t _Size>inline _LIBCPP_INLINE_VISIBILITYsize_tbitset<_Size>::count() const _NOEXCEPT{ return static_cast<size_t>(_VSTD::count(base::__make_iter(0), base::__make_iter(_Size), true));}<algorithm>template <class _InputIterator, class _Tp>inline _LIBCPP_INLINE_VISIBILITYtypename iterator_traits<_InputIterator>::difference_typecount(_InputIterator __first, _InputIterator __last, const _Tp& __value_){ typename iterator_traits<_InputIterator>::difference_type __r(0); for (; __first != __last; ++__first) if (*__first == __value_) ++__r; return __r;}
可以看到,这里实现的方式其实是按照会循环执行32次。但是我们只是关注了代码,并未考虑编译器的优化和硬件指令集。
https://www.quora.com/What-is-complexity-of-the-count-function-in-C++-std-bitset,这篇参考文章中说部分硬件会使用精心设计的硬件结构来进行实现count。
例如x86的部分CPU设计了指令popcnt来使用。
http://stackoverflow.com/questions/34407437/what-is-the-efficient-way-to-count-set-bits-at-a-position-or-lower,介绍了不同的有效率的count实现方法。
- leetcode 342
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode
- leetcode:
- leetcode:
- LeetCode
- leetcode
- LEETCODE
- leetcode
- leetCode
- leetcode
- [leetcode]
- LeetCode
- leetcode
- leetcode:
- CSU 1209 Three Jugs
- FZU 2216 The Longest Straight 枚举+二分
- Linux 编程经典书籍推荐
- 利用DrawerLayout实现侧滑抽屉的功能
- 用Eclipse 开发Dynamic Web Project应用程序
- leetcode 342
- PHP实现数据进行四舍五入的4种方法
- Android各种动画插值器的实例
- 计算几何模板
- Fragment加动画后快速点击屏幕进行切换 产生的异常: java.lang.IllegalStateException: No host
- GetModuleHandle,AfxGetInstanceHandle使用区别
- eclipse的常用快捷键
- CSU 1558 和与积
- UVA445 - Marvelous Mazes