編程之美 練習題

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




















發佈了55 篇原創文章 · 獲贊 9 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章