Leetcode342. 4的幂

Leetcode342. 4的幂

题目:
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
题解:
方案一:循环

方案二:数学计算
n=4i,i=log4n=logbnlogb4n=4^i,i=log_4{n}= \frac {log_b{n}}{log_b{4}}

方案三:位运算

  1. 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0:n&(n1)==0n\&(n-1)==0
  2. 4的幂是2的偶数幂,所以最大的int类型的4的幂数为:1010101032\underbrace{1010\cdots1010}_{32}

方案四:位运算+数学运算

  1. 判断是否是2的次幂,2的幂转换为二进制首位为1,其余为0:n&(n1)==0n\&(n-1)==0
  2. 4的幂:4k=(3+1)k=3k+3k1++31+14^k=(3+1)^k=3^k+3^{k-1}+\cdots+3^1+1,也就是对3取余数得1

scala代码如下:

/**
    * 循环
    *
    * @param num
    * @return
    */
  def isPowerOfFour(num: Int): Boolean = {

    var num1 = num
    while (num1 % 4 == 0) {
      num1 = num1 / 4
    }
    num1 == 1
  }

  /**
    * 数学计算
    *
    * @param num
    * @return
    */
  def isPowerOfFour2(num: Int): Boolean = {
    //通过对1取余,取出小数部分,看是不是0
    Math.round(Math.log(num) / Math.log(4)) % 1 == 0
  }

  /**
    * 位运算
    * 4的幂转换为二进制,偶数部分为1,奇数部分为0
    * 因此 4 的幂与数字 (101010...10)向与会得到 0。
    *
    * 1010...1010(32位)转换为16进制为aaaaaaaa
    *
    * @param num
    * @return
    */
  def isPowerOfFour3(num: Int): Boolean = {
    (num > 0) && ((num & (num - 1)) == 0) && ((num & 0xaaaaaaaa) == 0)
  }

  /**
    * 位运算+数学运算
    * 首先是2的幂,4的幂是2的偶数幂
    *
    * @param num
    * @return
    */
  def isPowerOfFour4(num: Int): Boolean = {
    (num > 0) && ((num & (num - 1)) == 0) && (num % 3 == 1)
  }
发布了86 篇原创文章 · 获赞 0 · 访问量 988
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览