皮皮安学算法第三天(二分查找)

写在前面

今天是学算法的第三天

“嚯,你个死皮皮安,第二天呢?被你吃了?”

“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;
	    }
	}

怎么说呢,都是简单题,但是还是暴露了我不少问题,慢慢来吧,每天试着多看看吧。

猜你喜欢

转载自blog.csdn.net/qq_46178251/article/details/107524585