如题,代码如下:
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");
}}
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");
}}
解决方案 »
- JDBC连接MYSQL能不能执行两条语句
- 关于java中paint的问题,跪求高手解答啊!!!
- 小菜求助大虾 急 下面解释处怎么提示找不到符号的?
- 关于loginservlet
- 怎么能让做出MSN那样的界面啊?
- 没分了啊以后有了一定补上啊!一个上传的问题啊!希望得到大家的帮助啊!谢谢了
- 多线程学习笔记
- 我要创建一个模式对话框,但是......
- 有没有人用过jBuilder中的PickList....急...
- 急!急!急!请问各位大哥:如何将FRAME上的咖啡标志改成自己设计的标记呢?一定加分!
- sqlserver2000 jdbc查询数据量大出错
- Ladies and 乡亲们:帮我看一下这个程序怎么改
* 两个数互换,不引用第三个变量
*/
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 常量更好一些。
* 最大子序列和问题
*/
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;
}
while (number == 0) {
number = new Random().nextInt(10001);
}
可以简化为
int number = new Random().nextInt(10000) + 1;
直接这样就应该行了吧!
/**
* 最大子序列和问题
*/
public static int maxSubSum(int[] a){
int maxSum = 0;
for(int value : a){
if(value > 0){
maxSum += value;
}
}
return maxSum;
}