基础算法示例(二分查找和快速排序):
import java.util.Scanner;
public class BinarySearch {
//BinarySearch
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int N = sc.nextInt();//数字个数
int M = sc.nextInt();//要查找的数字
int[] arr = new int[N];
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
int result = solution(N,M,arr);
if (result <0 ) {
System.out.println("Error");
}else {
System.out.println("Exist");
}
}
sc.close();
}
private static int solution(int n, int m, int[] arr) {
int low = 0;
int high = arr.length-1;
QuickSort(arr,low,high);
while (low <= high) {
int mid = low + ( high - low)/2;
if (m<arr[mid]) high = mid-1;
else if (m>arr[mid]) low = mid+1;
else return mid;
}
return -1;
}
private static void QuickSort(int[] arr, int indexStart, int indexEnd) {
// TODO Auto-generated method stub
int pivotIndex = (indexStart+indexEnd)/2;
//swap
swap(arr,pivotIndex,indexEnd);
int k = partition(arr,indexStart-1, indexEnd,arr[indexEnd]);
swap(arr, k, indexEnd);
if ((k - indexStart)>1)
QuickSort(arr, indexStart, k-1);
if ((indexEnd-k)>1)
QuickSort(arr, k+1, indexEnd);
}
private static int partition(int[] arr, int left, int right, int pivot) {
do {
while (arr[++left] < pivot)
;
while ((right!=0)&&arr[--right]>pivot)
;
swap(arr, left, right);
} while (left < right);
swap(arr, left, right);
return left;
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
问题1:什么是Java的字节码?
回答:是程序的一种低级表示,运行于Java虚拟机。
问题2:Math.abs(-2147483648)的返回值是什么?
回答:-2147483648,这是个整数溢出的典型例子。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
int result = Math.abs(-2147483648);
System.out.print(result);
}
}
问题3:如何才能将一个double变量初始化为无穷大?
回答:可以使用Java的内置常数:Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY。
问题4:能够将double类型的值和int类型的值相互比较吗?
回答:不通过类型转换是不行的,但Java一般会自动进行所需的类型转换。
问题5:如果使用一个变量前没有将它初始化,会发生什么?
回答:如果代码中存在任何可能导致使用未经初始化的变量的执行路径,Java都会抛出一个编译异常。
问题6:Java表达式1/0和1.0/0.0的值是什么?
回答:第一个表达式会产生一个运行是除以零异常(它会终止长须,因为这个值是未定义的)(Exception in thread "main" java.lang.ArithmeticException: / by zero);第二个表达式的值是Infinity(无穷大)。
问题7:能够使用<和>比较String变量吗?
回答:不能,只有原始数据类型定义了这些运算符。
问题8:负数的除法和余数的结果是什么?
回答:表达式a/b的商会向0取整;a%b的余数的定义是(a/b)*b+a%b恒等于a。
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(-14/3);
System.out.println(14/-3);
System.out.println(-14%3);
System.out.println(14%-3);
}
}
问题9:为什么使用(a&&b)而非(a&b)?
回答:运算符&、|和^分别表示整数的位逻辑操作与、或和异或。&&和||运算符仅在独立的布尔表达式中有效,原因是短路求值原则:表达式从左向右求值,一旦整个表达值的值已知则停止求值。
问题10:嵌套if语句中的二义性有问题吗?
回答:是,在Java中,if <expr1> if<expr2><stmntA> else <stmntB>等价于 if<expr1>{if<expr2><stmntA>else<stmntB>}。避免“无主的”else陷阱的最好方法是显示地写明所有大括号。
问题11:一个for循环和它的while形式有什么区别?
回答:for循环头部的代码和for循环的主体代码在同一个代码段中。在一个典型的for循环中,递增变量一般在循环结束之后都是不可用的;但在和它等价的while循环中,递增变量在循环结束之后仍然是可用的。这个区别常常是使用while而非for循环的主要原因。
问题12:int a[]和int[] a 来声明一个数组,有什么不同?
回答:在Java中,两者都是合法且等价的。前者是C语言中数组的声明方式,后者是Java提倡的方式,因为变量的类型int[]更能清楚地说明这是一个整型的数组。
问题13:为什么数组的起始索引是0而不是1?
回答:起源于机器语言,将起始索引设置为1要么会浪费数组的第一个元素的空间,要么会花费额外的时间来将索引间1。
问题14:如果a[]是一个数组,那么System.out.println(a)打印出来的是一个十六进制的整数?
回答:该方法打印的是这个数组的地址。
问题15:程序能够重新读取标准输入中的值吗?
回答:不能,只有一次机会
问题16:程序在标准输入为空之后仍然尝试读取,会发生什么?
回答:得到一个错误。可以使用isEmpty()函数,帮助检查是否还有可用的输入。
问题17:在Java中,一个静态方法能够将另一个静态方法作为参数吗?
回答:不行。