算法(第1天)

基础算法示例(二分查找和快速排序):

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中,一个静态方法能够将另一个静态方法作为参数吗?

回答:不行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值