求解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; }