JavaSE面试问题总结
1.如何更快实现2的3次方
如何实现任意数的任意次幂
代码如下:
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("请输入基数num的值");
int num=sc.nextInt();
System.out.println("请输入幂power的值");
int power=sc.nextInt();
int result=1;
for (int i=0;i<power;i++){
result=result*num;
}
System.out.println(num+"的"+power+"次幂的值为:"+result);
若想要快速实现2的3次方 则只需将其进行移位处理
代码如下:
int num2=1<<3;
System.out.println(num2);
2.二分(折半)查找的优化问题
插值查找算法
可以发现二分查找每次都是选取中间的那个记录关键字作为划分依据的,那为什么不可以是其他位置的关键字呢?在有些情况下,使用二分查找算法并不是最合适的。举个例子:在1-1000中,一共有1000个关键字,如果要查找关键字10,按照二分查找算法,需要从500开始划分,这样的话效率就比较低了,所以有人提出了插值查找算法。说白了就是改变划分的比例,比如三分或者四分。
插值查找算法对二分查找算法的改进主要体现在mid的计算上,其计算公式如下:
而原来二分查找的公式是这样的:
代码实现:
private static int binarySearch(int []arr,int i,int j,int data){
if (i>j){
return -1;
}
//若要优化二分查找 插值查找算法 则将mid赋值改为 int mid=(j-i+1)/2+i;
int mid=(j-i+1)/2+i;
if (arr[mid]==data){
//递归条件结束
return mid;
}
if (arr[mid]>data){
i<->mid-1范围内中data
return binarySearch(arr,i,mid-1,data);
}
else {
//mid+1<->j范围内中data
return binarySearch(arr,mid+1,j,data);
}
}
3.Java异常块中try块中return;语句和System.exit(0)语句之间是有区别的
return语句:用来从当前方法中退出,返回到调用该方法的语句处,并从紧跟该语句的下一条语句继续执行。
System.exit(0):从程序的任意地方直接一步到位的退出程序。
4.选择题:short a=0;a+=1;a=a+1;哪个会发生编译错误?
A.short a=10;a=a+1;//编译报错
由于a+1运算时会自动提升表达式的类型,为int类型, 结果赋值给short类型的a时,类型会不匹配,所以编译报错
B.short a=10;a+=1;//正常编译 因为java编译器会对+=做特殊处理,进行类型转换,因此可以正常编译。
5.整型数组,通过代码实现奇数在前,偶数在后的问题。
先计算出奇数的个数count,然后用双指针来遍历,一个从头遍历到count, 一个从数组尾部遍历到count。从前向后找到一个偶数的下标, 从后向前找到一个奇数的下标,然后交换对应的值。直到遍历完整个数组。
时间复杂度为O(n),空间复杂度为O(1)。
int []arr={
1,2,3,4,5,6,7,8,9};
fun(arr);
System.out.println(Arrays.toString(arr));
}
private static void fun(int[] arr