如题,代码如下:
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");
}}

解决方案 »

  1.   

        /**
         * 两个数互换,不引用第三个变量
         */
        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;
        }下面那个不行!当 a + b 的和溢出 Integer.MAX_VALUE 时就不正确了。    /**
         * 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");
        }用 Double.NaN、Float.NaN 常量更好一些。
      

  2.   

    最大子序列和问题最优算法: /**
     * 最大子序列和问题
     */
    public static int maxSubSum(int[] a){
    int maxSum = 0;
    int thisSum = 0;
    for(int value : a){
    thisSum += value;
    if(thisSum > maxSum){
    maxSum = thisSum;
    }
    else if(thisSum < 0){
    thisSum = 0;
    }
    }
    return maxSum;
    }
      

  3.   

    int number = new Random().nextInt(10001);
      while (number == 0) {
        number = new Random().nextInt(10001);
      }
    可以简化为
    int number = new Random().nextInt(10000) + 1;
      

  4.   

    一个已知的1-10000的int数组,中间去掉了一个,查找少了哪一个? 这个写得最没把握,多多指正将int数组中所有的数异或,在与1-10000这些数分别异或,剩下就是缺少得数
      

  5.   

    这是求int数组中的所有正数的和吗?
    直接这样就应该行了吧!
    /**
         * 最大子序列和问题
         */
        public static int maxSubSum(int[] a){
            int maxSum = 0;
            for(int value : a){
                if(value > 0){
                    maxSum += value;
                }
            }
            return maxSum;
        }