问题描述:给定一个整数,写一个函数来判断它是否是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();
}