编程之美 练习题

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




















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值