import java.util.Arrays;
import java.util.Random;
/**
* 几个经典的java算法面试题集锦,答案并不一定标准,多多指正
*
* @author lance
* @date 2010-09-04 15:23
*/
public class SomeDemo {
public static void main(String args[]) {
findNumber();
substring();
exchange();
compare();
createNaN();
}
/**
* 一个已知的1-10000的int数组,中间去掉了一个,查找少了哪一个? 这个写得最没把握,多多指正
*/
public static void findNumber() {
// 初始化一个1-10000的数组,中间随机少一个数
int number = new Random().nextInt(10001);
while (number == 0) {
number = new Random().nextInt(10001);
}
int[] srcArray = new int[9999];
for (int i = 1; i <= 10000; i++) {
if (i < number) {
srcArray[i - 1] = i;
} else if (i > number) {
srcArray[i - 2] = i;
}
}
// 先升序排列,然后处理首尾元素,再二分查找缺少的元素
Arrays.sort(srcArray);
int findResult = -1;
// 首尾元素直接处理
if (srcArray[0] == 2) {
findResult = 1;
} else if (srcArray[srcArray.length - 1] == 9999) {
findResult = 10000;
}
if (findResult == -1) {
// 二分查找元素
int head = 0;
int end = srcArray.length;
while (head < end) {
int middle = (head + end) / 2;
// 前面处理了首尾元素,因此这里不用担心数组越界了
if (srcArray[middle] == srcArray[middle + 1] - 2) {
findResult = srcArray[middle] + 1;
break;
} else if (srcArray[middle] == middle + 1) {
head = middle;
} else if (srcArray[middle] == middle + 2) {
end = middle;
}
}
}
System.out.println("随机产生的数=" + number);
System.out.println("找到的数=" + findResult + "\n");
}
/**
* 从字母数字中文混合的String中截取指定大小的byte字符串,保证不乱码
*/
public static void substring() {
String src = "test测试字符串";
int length = 5;
String result = null;
for (int i = 0; i < src.length(); i++) {
if (src.substring(0, i).getBytes().length >= length) {
result = src.substring(0, i);
break;
}
}
System.out.println(result + "\n");
}
/**
* 两个数互换,不引用第三个变量
*/
public static void exchange() {
int a = 5; // 任意数
int b = 10; // 任意数
System.out.println("1. a=" + a + "\t b=" + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("2. a=" + a + "\t b=" + b + "\n");
// 下面这个也可以
// a = a + b;
// b = a - b;
// a = a - b;
}
/**
* java中NaN值的产生
*/
public static void createNaN() {
// 在Double和Float类型中有NaN值; Integer,Long中没有.
double a = 0, b = 0, c;
c = a / (a + b);
System.out.println(c + "\n");
}
/**
* java中两个自己不等于自己(即 o!=o 为true)的值, NaN和无穷大数
*/
public static void compare() {
// 1
double o = Double.longBitsToDouble(0x7ff8000000000000L);
System.out.println(o != o);
// 2
System.out.println(Float.NaN != Float.NaN);
System.out.println((Double.NaN != Double.NaN) + "\n");
}
}