LeetCode 342.4的幂 -Java

问题描述

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

示例 1:

输入: 16
输出: true

示例2:

输入: 5
输出: false


解题思路

好多种方法可以求解该题.
分析:首先看4的二进制的特点,为1,100,10000…100000000, 1都在奇数位,0的个数为偶数个.
另外一种解释看大佬的是先确认是2的幂,然后对3求余,余1的话就是4的幂.
当然还可以用一直/4后取余是否为0.可惜这种方法超时了,暴力方法现在不可取.


代码演示


1.

public static boolean isPowerOfFour(int num) {
		if (num <= 0)
			return false;
		if (Integer.bitCount(num) == 1 ) { // 先看是否为2的幂
			if (Integer.toBinaryString(num).length() % 2 == 1) { // 位数是否为奇数
				return true;
			}
		}
		return false;
	}

2.

 public static boolean isPowerOfFour(int num) {
			if (num <= 0) {
				return false;
	        } else if(num == 1) {
	            return true;
	        } else if(Integer.bitCount(num) == 1) {
				if (num%3==1) { // 对3求余是否为1
					return true;
				}
				return false;
			} else {
				return false;
			}
		}

3.

 public static boolean isPowerOfFour6(int num) {
		    return num>0?(Integer.bitCount(num)==1 ?((num&0x55555555)!=0 ? true:false):false):false;
		}

一行搞定,num&0x55555555的用意在于只保留奇数位的值. 因为4的幂的话,1一定在奇数位,所以相与后的结果是否与原数相等.
扩展开来就是:

       if (num <= 0)
				return false;
		if (Integer.bitCount(num) == 1) { // 判断该数是否为2的幂
			if ((num&0x55555555)!=0) { //若1在二进制奇数位,那么与0x55555555则为原数
					return true;
			}
		}
		return false;

4.

public static boolean isPowerOfFour(int num) {
		String str = Integer.toBinaryString(num);
		String s = str.replace("00", "");
		return s.equals("1");
	}

这种方法虽然可行,可是效率特别低,只是扩展一种思路

刚开始的思路 (错误:超时)

 public boolean isPowerOfFour(int num) {
		try {
        if(num == 1) { return true; }
        int temp = Integer.valueOf(Integer.toString(num, 4)); // 将该数转换为4进制数,因此temp的之值为1,100,10000...(可是这时temp为十进制数,不能认为是二进制.)
			while (temp%10 == 0) {
			temp /= 10; 
		    }
            return temp == 1;
        } catch(Exception e) {
            return false;
        }
	}

受限于求2的幂的想法,因此无法求解.过了两天就能做出来了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值