非科班儿更需要好好学算法

哎呀,大噶好,我是方圆
过完双节再不写博客儿,脑子就真的要废掉了

系列文章

需要用到的官方扩展包(代码中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. 小知识

  1. 在逻辑运算符中,!拥有最高优先级,之后是&&,接下来是||。
  2. double的无穷大和无穷小:Double.POSITIVE_INFINITY(1.0/0.0)Double.NEGATIVE_INFINITY(-1.0/0.0)
  3. Java表达式1/0会产生一个运行时除以零的异常;1.0/0.0则表示Infinity(无穷大)。
  4. 为什么数组的起始索引是0而不是1
    这个习惯来源于机器语言,那时要计算一个数组元素的地址需要将数组的起始地址加上该元素的索引。

巨人的肩膀

《算法(第四版)》P1 - P32


我以为今天能看好多呢,还是高估自己了,哈哈哈,要继续加油儿!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值