四个算法笔试题(一)

[size=small] 本周参加了一次笔试,四个算法设计题,当时什么都不会,回来研究了两天,下面为研究结果:

1、判断一个整数是否是素数[size=medium][/size]
当时连素数的概念都不知道了,于是当成奇数去写了,真是惭愧啊

/**算法设计:
*素数是指只能被 1 和它本身整除的数字,那么,从 2 到 N-1 之间,如果有任何一个数能*整除 N ,则 N 就不是素数,所以只需要对 N 从 2 到 N-1 进行循环取整即可。但是,只*需要判断到 N/2 就可以了,甚至只需要判断到 N 开平方即可,原因:假设 i*i=N,如果 *N 能被整除,那么其中一个数肯定小于 i ,另一个肯定大于 i ,或者直接就是 i 。
*另外,因为 1 不是素数,所以提前将 1 排除。
*/
public boolean isPrime(int n){
//1不是素数
if(n<=1){
return false;
}else{
for (int i = 2; i <= Math.sqrt(n); i++) {
//如何一时间忘了开平方怎么写,可以循环到n/2
//for(int i=2;i<=n/2;i++){
if(n%i==0){
return false;
}
}
}
return true;
}

2、用二分查找法从一个整数数组中查找任意一个整数,如果存在,返回它在该数组中的位置,如果不存在,返回-1
/**
*说明:这个数组必须是有序的,因为对一个无序数组进行二分查找是没有任何意义的
*算法设计:
*1:设置一个低标志位low,一个高标志位high,一个中间标志位middle,将查找范围定为*整个数组,low为数组的最小下标,high为最下标,middle=(low+high)/2
*2:将 N 与数组中middle标志位的值进行比较,如果相等,则返回middle
*3:如果 N 小于middle标志位的值,则将查找范围定为数组的前半部分,将高标志位移至 *中间标志位的前一位,即high=middle-1
*4:如果 N 大于middle标志位的值,则将查找范围定为数组的后半部分,将低标志位移至
*中间标志位的后一位,即low=middle+1
*5:只要low小于high,则一直执行前3个步骤,如果low大于high,则表示该值不在数组中
*/

//非递归写法
public int binarySearch(int[] arr,int n){
int low = 0;
int high = arr.lenght;
while(low < high){
int middle = (low + high)/2;
if(n == arr[middle]){
return middle;
}else if(n < arr[middle]){
high = middle-1;
}else{
low = middle + 1;
}
}
return -1;
}

//递归写法
public int binarySearch(int[] arr,int n,int low,int high){
if(low > high){
return -1;
}
int middle = (low + high)/2;
if(n == arr[middle]){
return middle;
}else{
if(n < arr[middle]){
return binarySearch(arr,n,low, middle-1);
}else{
return binarySearch(arr,n,middle+1,high);
}
}

}[/size][/size][/size][/size]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值