哎呀,大噶好,我是
方圆
过完双节
再不写博客儿,脑子就真的要废掉了
系列文章
需要用到的官方扩展包(代码中In、Std等均需要此包):下载地址
1. 二分查找法
二分查找法还是非常简单的,它的前提是
数组有序
,如果被查找的键等于a[mid],返回mid;否则将将算法的搜索范围减小一半,如果被查找的键小于a[mid]就继续在左半边查找,如果被查找的键大于a[mid]就继续在右半边查找。找到或者没有找到循环都会结束。
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import java.util.Arrays;
/**
* 二分查找
* 若存在我们要找的数字,返回它的位置;
* 若不存在,则打印一条信息。
*/
public class BinarySearch {
public static int rank (int key, int[] a) {
int lo = 0;
int hi = a.length - 1;
while (lo <= hi) {
int mid = (lo + hi) / 2;
if(key < a[mid]) hi = mid - 1;
else if(key > a[mid]) lo = mid + 1;
else return mid;
}
return -1;
}
public static void main(String[] args) {
int [] whitelist = new In("C:\\Users\\37407\\Desktop\\demo1.txt").readAllInts();
Arrays.sort(whitelist);
while(!StdIn.isEmpty()) {
int key = StdIn.readInt();
int index = rank(key, whitelist);
if(index != -1) StdOut.print(index);
else System.out.println("宝贝儿,你要找的人不存在哟!");
}
}
}
- 测试结果
对应《算法(第四版)》P6实例,博主进行了简单的修改
Tip: 不会吧?不会吧? 难倒我是最后一个知道用Java这样写科学计数法的数字吗?1.0e-15
1.1 二分查找的递归写法
import edu.princeton.cs.algs4.In;
import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;
import java.util.Arrays;
/**
* 二分查找的递归写法
*/
public class BinarySearchRecur {
public static int rank (int key, int[] a) {
return recur(key, a, 0, a.length - 1);
}
public static int recur(int key, int[] a, int lo, int hi) {
if(lo > hi) return -1;
int mid = (lo + hi) / 2;
if(key < a[mid]) return recur(key, a, lo, mid - 1);
if(key > a[mid]) return recur(key, a, mid + 1, hi);
else return mid;
}
public static void main(String[] args) {
int [] whitelist = new In("C:\\Users\\37407\\Desktop\\demo1.txt").readAllInts();
Arrays.sort(whitelist);
while(!StdIn.isEmpty()) {
int key = StdIn.readInt();
int index = rank(key, whitelist);
if(index != -1) StdOut.print(index);
else System.out.println("宝贝儿,你要找的人不存在哟!");
}
}
}
递归写法也是非常的简单。
2. printf()方法的用法
-
我们常用的转换代码包括
d(Java整型的十进制数)
、f(浮点型)
和s(字符串)
。 -
在%和转换代码之间插入可以插入值的宽度,
默认情况
下会在字符串的左边
添加空格以达到需要的宽度(右对齐),如果想在右边
加入空格我们需要使用负数的宽度
(左对齐)。 -
在宽度之后我们还可以插入
一个小数点以及一个数值
来指定转换后的double值保留的小数位数或者是String类型的截取长度。 -
测试代码 ↓
public class PrintfDemo {
public static void main(String[] args) {
System.out.printf("测试转换代码,%d,%f,%s\n",1,1.0,"字符串类型转换代码");
System.out.println("---------");
System.out.printf("测试插入值的宽度,%30d\n",33);
System.out.printf("测试插入值的宽度,%-30d\n",33);
System.out.println("---------");
System.out.printf("测试小数点位数,%.3f\n",Math.PI);
System.out.printf("测试截取字符串的长度,%-33.5s","Hello World");//只会打印出Hello
}
}
- 测试结果
3. 小知识
- 在逻辑运算符中,!拥有
最高优先级
,之后是&&,接下来是||。 - double的无穷大和无穷小:
Double.POSITIVE_INFINITY(1.0/0.0)
和Double.NEGATIVE_INFINITY(-1.0/0.0)
。 - Java
表达式1/0
会产生一个运行时除以零的异常;1.0/0.0
则表示Infinity(无穷大)。 - 为什么数组的起始索引
是0而不是1
?
这个习惯来源于机器语言
,那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索引。
巨人的肩膀
《算法(第四版)》P1 - P32
我以为今天能看好多呢,还是高估自己了,哈哈哈,要继续加油儿!!!