写在前面
今天是学算法的第三天
“嚯,你个死皮皮安,第二天呢?被你吃了?”
“ennnnnn,第二篇太捞了,有空可以去我主页看”
“说的你不捞一样”
今天看了一下午算法,说是一下午,大概也就三个小时吧,进度很慢,主要花在做题上面,后面我也会把今天写的题和源码发出来。
今日所学
二分查找
定义:
算法是由静态方法rank()实现的,它接受一个整数键和一个已经有序的int数组作为参数。如果该键存在于数组中则返回他的索引,否则返回-1.算法使用两个变量lo和hi,并保证如果键在数组中则它一定在a[lo…hi]中,然后方法进入一个循环,不断将数组的中间件(索引为mid)和被查找的键比较,如果被查找的键等于a[mid],返回mid;否则算法就将查找范围缩小一半,如果被查找的键小于a[mid]就继续在左半边查找,如果被查找的键大于a[mid]就继续在右边查找。算法找的被查找的键或者查找范围为空时该过程结束。二分查找之所以快是因为只需检查很少的几个条目(相对于数组的大小)就能够找到目标元素(或者确认目标元素不存在)。
“嚯,你皮皮安又抄书”
…
源码
package 第一章.基础编程模型.二分查找;
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){
//被查找的键要么不存在,要么必然存在于a[lo..hi]之中
int mid = lo + (hi - lo) / 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 = In.readInts(args[0]);
Arrays.sort(whitelist);
while (!StdIn.isEmpty())
{
//读取键值,如果不存在于白名单中将其打印
int key = StdIn.readInt();
if (rank(key,whitelist)<0)
StdOut.println(key);
}
}
}
“又偷代码了”
…这叫借鉴,好吧好吧,上自己写的…太捞了
1.编写一个程序,从命令行得到三个整数参数。如果都相等则打印equal,否则打印not equal
package 第一章.基础编程模型.课后作业;
import java.util.Scanner;
public class test02 {
/*编写一个程序,从命令行得到三个整数参数。
如果都相等则打印equal,否则打印not equal
* */
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.printf("请输入三个整数:");
int a = input.nextInt();
int b = input.nextInt();
int c = input.nextInt();
if (a==b||b==c||a==c)
System.out.println("equal");
else System.out.println("not equal");
}
}
2.编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
package 第一章.基础编程模型.课后作业;
import java.util.Scanner;
//编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
public class test05 {
public static void main(String[] args) {
final int M = 3;
final int N = 3;
Scanner input = new Scanner(System.in);
int[][] a = new int[M][N];
System.out.println("数组初始化:");
int i = 0;
int j = 0;
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
// a[i][j] = input.nextInt();
a[i][j] = (int)( Math.random()*10);
}
}
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
System.out.printf(String.valueOf(a[i][j])+" ");
}
System.out.println();
}
System.out.println("----------------------------");
for (i = 0; i < M; i++) {
for (j = 0; j < N; j++) {
System.out.printf(String.valueOf(a[j][i])+" ");
}
System.out.println();
}
}
}
3.编写一个静态方法lg(),接受一个整形参数N,返回一个不大于logN(底数默认为2)的最大整数。不使用Math库
package 第一章.基础编程模型.课后作业;
/*
编写一个静态方法lg(),接受一个整形参数N,返回一个不大于logN(底数默认为2)的最大整数。不使用Math库
*/
public class test06 {
public static void main(String[] args) {
System.out.println(lg(100));
}
public static int lg(int N){
int sum = 1;
int key = 0;
for (int x = 0; x < 1000; x++) {
sum*=2;
if (sum>=N) {
key = x;
break;
}
}
// int x =0;
// while (x<1000){
// sum *= 2;
// if (sum>=N)
// {
// key = N;
// break;
// }
// x++;
// }
// System.out.println(sum);
return key-1;
}
}
怎么说呢,都是简单题,但是还是暴露了我不少问题,慢慢来吧,每天试着多看看吧。