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