求解n!末尾0的个数
public static int zeroCount(int n)//n!中0的个数
{
int count=0;
int m;
while(n>1)
{
m=n;
while(m%5==0)
{
count++;
m/=5;
}
n--;
}
return count;
}
n!最低位1的位置
public static int lowestOne(int n)//n中最低位1的位置
{
int ret=1;
while(n!=0)
{
if((n&1)==1)
{
break;
}
n>>=1;
ret++;
}
return ret;
}
在一个数组中快速找出两个数字,使它们的和等于一个给定的数字
方法1
将问题转化为查看SUM-arr[i]是否在数组中
先对整个数组排序,然后二分查找
时间复杂度nlog2n
public static void main(String[]args)
{
int[]arr=new int[]{3,2,1,7,5,6,4,0,8,9};
int[]temp=arr.clone();
mSort(arr,temp,0,arr.length);
int index = 0;
int i;
int sum=4//自己输入
for(i=0;i<arr.length;i++)
{
index=binarySearch(arr,0,arr.length-1,sum-arr[i]);
if(index!=-1)
{
break;
}
}
System.out.println(arr[index]+" "+arr[i]);
}
一个数的二进制表示中1的个数
public static int oneNumber(int n)
{
int number=0;
while(n!=0)
{
n=n&(n-1);
number++;
}
return number;
}
寻找1-100中的所有素数
public static boolean isZero(byte[]bitArray,int bit)
{
int index=bit/8;
bit=1<<(7-(bit&7));
if((bitArray[index]&bit)!=0)
return false;
else
return true;
}
public static void setBit(byte[]bitArray,int bit)
{
int index=bit/8;
bit=1<<(7-(bit&7));
bitArray[index]|=bit;
}
public static void main(String[]args)
{
byte[] b=new byte[13];
int m=0;
for(int i=2;i*i<100;i++)
{
if(isZero(b,i))
{
m=2*i;
while(m<100)
{
setBit(b,m);
m+=i;
}
}
}
for(int i=2;i<100;i++)
{
if(isZero(b,i))
System.out.print(i+" ");
}
}
寻找若干个点中距离最近的两个点
穷举法
public static int[] closestPair(ArrayList<Integer>x,ArrayList<Integer>y)
{
int[] closest=new int[2];
int xLength=x.size();
int indexX =-1,indexY =-1;
int dmin=Integer.MAX_VALUE;
for(int i=0;i<xLength-1;i++)
{
for(int j=i+1;j<xLength;j++)
{
int d=sqrt(x.get(i)-x.get(j))+sqrt(y.get(i)-y.get(j));
if(d<dmin)
{
dmin=d;
indexX=i;
indexY=j;
}
}
}
closest[0]=indexX;
closest[1]=indexY;
return closest;
}
寻找一个无序数组中最大值和最小值要求比较次数尽可能少
总共比较1.5N
public static int[] findMaxAndMin(int[]arr)
{
int[]num=new int[2];
num[0]=arr[0];//代表小的
num[1]=arr[arr.length-1];//代表大的
for(int i=0,j=arr.length-1;i<=j;i++,j--)
{
if(arr[i]>arr[j])//每次比较数组中两个数谁大
{
if(arr[i]>num[1])//再比较大的那个和当前最大值哪个大
{
num[1]=arr[i];
}
if(arr[j]<num[0])//再比较小的那个和当前最小值哪个小
{
num[0]=arr[j];
}
}
else
{
if(arr[i]<num[0])
{
num[0]=arr[i];
}
if(arr[j]>num[1])
{
num[1]=arr[j];
}
}
}
return num;
}