207 多种方式解4的幂和最后一块石头的重量

文章介绍了两种方法:位运算检查整数是否为4的幂次方,以及使用最大堆解决石头游戏中最后剩余石头重量的问题。位运算通过计数1的位数和奇偶性确定,公式计算则基于4的幂次方减一的特性。
摘要由CSDN通过智能技术生成

问题描述:给定一个整数,写一个函数来判断它是否是4的幂次方,如果是,返回true,否则返回false,整数n是4的幂次方需满足n==4^x。

位运算求解:4的幂次方一定是2的幂次方,从而只有一位数字是1,其余都是0,且奇数位置时1.

public Boolean is4N(int n)
{
int index=0;
int numberOne=0;
for(int i=0;i<32;i++)
{
if(n>>i&1==1){numberOne++;index=i;}
}
if(numberOne!=1)
{
return false;
}else
{
if(index%2==0){return true;}
else{return false;}
}
}

公式计算的方法:我们来观察以下4的幂次方的一些特点,4的幂次方不好观察,来研究以下4的幂次方减1,研究这个特点之前一定要明白这样一条规律。任何连续的n个自然数的乘积一定被n整除。4^n-1=(2^n+1)*(2^n-1),因为2^n+1,2^n,2^n-1,这三个连续的自然数中一定有一个能被3整除,因为2^n不能被3整除,所以2^n-1和2^x-1中必有一个被3整除,所以4^n-1一定会被3整除,如果一个数时2的幂次方,其减1还能被3整除,那么它一定是4的幂次方。

public Boolean is4N(int n)
{
int numberOne=0;
for(int i=0;i<32;i++)
{
if((n>>i)&1==1){numberOne++;}
}
if(numberOne!=1){return false;}
else
{
if(n%3==0){return true;}
else{return false;}
}
}

问题描述:有一堆石头,每块石头的重量都是正整数,每一回合,从中选出两块最重的石头,然后将他们一起粉碎,假设石头的重量分别是x和y,且x<=y,那么粉碎的结果可能如下:如果x==y,那么两块石头都会完全粉碎,如果x!=y,那么重量为x的石头会被完全粉碎,而重量为y的石头新重量为y-x,最后最多只会剩下一块石头,返回此石头的重量。

public int lastRockWeight(int []nums)
{
int lastRockWeight=nums[0];
for(int i=1;i<nums.length;i++)
{
if(nums[i]>=lastRockWeight)
{
lastRockWeight=nums[i]-lastRockWeight;
}else 
{
lastRockWeight=-nums[i]+lastRockWeight;
}
}
return lastRockWeight;
}

也可以用最大堆的方式进行求解,每次往堆中放入和取出都会进行调整。最后剩下的就是那一个元素。

public int getLastRock(int []nums)
{
PriorityQueue<Integer>pq=new PriorityQueue<>((a,b)->{return b-a;});
for(int num:nums){pq.offer(nums[i]);}
while(pq.size()>1)
{
int last=pq.poll();
int secondLast=pq.poll();
if(last!=second)
{
pq.offer(Math.abs(last=secondLast));
}
}
return pq.poll();
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值