2012年的最后一天,轻松一点,写个简单点的程序,同样也是面试与被面试经常考查的一个题,不要以为真的容易哦, 拒说有90 % 的程序员不能完全写对二分算法呢,好吧,这话可不是我说的,有兴趣的可以上网查查。主要还是细节问题,思路大家都知道,在这里就不重复了。看下面的代码吧。
1. 这个写得对吗,真的没问题吗?
public class BinaryQuery {
public static void main(String[] args) {
int array[] = {2, 3, 5, 23, 43, 49, 52, 67, 77};
BinaryQuery bq = new BinaryQuery();
int a = bq.query(array, 23);
System. out.println(a);
}
private int query(int[] array, int key) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while(low < high){ //要注意这里
mid = (low + high)/2;
if(array[mid] == key){
return array[mid];
} else{
if(array[mid] > key){
high = mid - 1;
} else if (array[mid] < key){
low = mid + 1;
}
}
}
return -1;
}
}
2. 把上面的小bug改掉以后,这个真得好吗,大数相加会怎么样?
public class BinaryQuery {
public static void main(String[] args) {
int array[] = {2, 3, 5, 23, 43, 49, 52, 67, 77};
BinaryQuery bq = new BinaryQuery();
int a = bq.query(array, 23);
System. out.println(a);
}
private int query(int[] array, int key) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while(low <= high){
mid = (low + high)/2;
if(array[mid] == key){
return array[mid];
} else{
if(array[mid] > key){
high = mid - 1;
} else if (array[mid] < key){
low = mid + 1;
}
}
}
return -1;
}
}
把mid = (low + high)/2; 写成mid = low + (high - low)/2;
那最后的核心代码是
private int query(int[] array, int key) {
int low = 0;
int high = array.length - 1;
int mid = 0;
while(low <= high){
mid = low + (high - low)/2;
//mid = (low + high)/2;
if(array[mid] == key){
return array[mid];
} else{
if(array[mid] > key){
high = mid - 1;
} else if (array[mid] < key){
low = mid + 1;
}
}
}
return -1;
}
暂时就想到这些,如果还有需要注意的细节,欢迎留言告诉我,帮助我也帮助别人,当然最重要的是帮助自己。 2012年12月31日,最后一天,年终总结有木有?