Java基础 - 8 - 算法、正则表达式

news2024/11/27 4:36:11

一. 算法

什么是算法?

        解决某个实际问题的过程和方法

学习算法的技巧?

        先搞清楚算法的流程,再直接去推敲如何写算法

1.1 排序算法

1.1.1 冒泡排序

        每次从数组中找出最大值放在数组的后面去

public class demo {
    public static void main(String[] args) {
        int[] arr = {5,2,3,1};
        //升序排序【1,2,3,5】
        //外循环控制排序轮数,内循环控制每一轮的遍历
        //n个数需要排序n-1轮
        for (int i = 0; i < arr.length - 1; i++) {
            //每一轮的目标是找到最大值,并放在最后一个位置
            //n个数 第一轮需要比较n-1次,第二轮需要比较n-2次 …… 第n-1轮需要比较1次
            for (int j = 0; j < arr.length - i - 1; j++) {
                //如果前一个数大于后一个数,则进行交换
                if(arr[j] > arr[j+1]){
                    int temp;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

1.1.2 选择排序

        每次选择当前位置,开始找出后面的较小值与该位置交换

public class demo {
    public static void main(String[] args) {
        int[] arr = {5,1,3,2};
        //升序排序【1,2,3,5】
        selectionSort(arr);
        selectionSort1(arr);
    }

    //普通选择排序
    private static void selectionSort(int[] arr) {
        //外循环控制排序轮数,内循环控制每一轮的遍历
        //n个数需要排序n-1轮
        for (int i = 0; i < arr.length - 1; i++) {
            //每一轮的目标是确定当前位置的值(确定arr[i]的值)
            //j依次记录当前位置后面位置的值(要记录到最后一个位置)
            //如第一轮确定arr[0]的值,j应该从位置1到位置n-1(一共n个数)
            for (int j = i + 1 ; j < arr.length; j++) {
                //如果当前位置的值大于后面的值,就进行交换
                if(arr[i] > arr[j]){
                    int temp;
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }

    //改进选择排序
    //减少交换次数,每一轮确定后面位置的最小值,再进行排序,这样每轮最多只需要交换一次
    private static void selectionSort1(int[] arr) {
        //n个数需要排序n-1轮
        for (int i = 0; i < arr.length - 1; i++) {
            //每一轮的目标是确定当前位置的值(确定arr[i]的值)
            //j依次记录当前位置后面位置的值(要记录到最后一个位置)
            //每轮确定后面位置的最小值再进行交换,用一个变量记录最小值位置的索引
            int minIndex = i;
            for (int j = i + 1 ; j < arr.length; j++) {
                //用minIndex记录这一轮的最小值
                if(arr[minIndex] > arr[j]){
                    minIndex = j;
                }
            }
            //该轮最小值不是arr[i],则和最小值交换位置
            if(minIndex != i){
                int temp;
                temp = arr[minIndex];
                arr[minIndex] = arr[i];
                arr[i] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

1.2 查找算法

1.2.1 顺序查找(基本查找)

注意:再数据量特别大的时候,基本查找这种从前往后挨个找的形式,性能是很差的

1.2.2 二分查找(折半查找)

        前提条件:数组中的数据必须是有序的

        核心思想:每次排除一半的数据,查询数据的性能明显提高很多

        折半条件:二分查找正常的折半条件应该是开始位置left<=结束位置right

public class demo {
    public static void main(String[] args) {
        int[] arr = {7,23,79,81,103,127,131,147};
        int index = binarySearch(arr,81);
        if(index != arr.length){
            System.out.println("您要找的数据在数组的索引值是"+index);
        }

        //Java中Arrays类提供了二分查找的方法
        System.out.println(Arrays.binarySearch(arr, 131));
    }

    public static int binarySearch(int[] arr,int data){
        //定义两个变量记录左右两端的位置
        int left = 0;
        int right = arr.length - 1;

        //定义一个循环
        while(left <= right){
            int mid = (left + right) / 2;
            if(arr[mid] == data){
                return mid;
            }else if(arr[mid] > data){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        //循环结束,还没有找到,才会执行到这里
        System.out.println("未查找到"+data);
        return -1;
    }
}

二. 正则表达式

2.1 认识正则表达式 

        就是由一些特定的字符组成,代表的是一个规则

        正则表达式作用一:用来校验数据格式是否合法

        正则表达式作用二:在一段文本中查找满足要求的内容

public class demo {
    public static void main(String[] args) {
        //校验QQ号码是否正确,要求全部都是数字,长度在(6-20)之间,不能用0开头
        System.out.println(checkQQ(null));  //为空返回false
        System.out.println(checkQQ("12345"));  //长度不在6-20之间返回false
        System.out.println(checkQQ("012345"));  //0开头返回false
        System.out.println(checkQQ("12345678abc"));  //不都是数字返回false
        System.out.println(checkQQ("12345678"));  //true

        System.out.println("===============================");
        //正则表达式校验
        System.out.println(checkQQ1(null));  //为空返回false
        System.out.println(checkQQ1("12345"));  //长度不在6-20之间返回false
        System.out.println(checkQQ1("012345"));  //0开头返回false
        System.out.println(checkQQ1("12345678abc"));  //不都是数字返回false
        System.out.println(checkQQ1("12345678"));  //true
    }

    //运用正则表达式
    //String提供了一个匹配正则表达式的方法
    //public boolean matches(String regex) 判断字符串是否匹配正则表达式,匹配返回true,不匹配返回false
    private static boolean checkQQ1(String s) {
        return s!=null && s.matches("[1-9]\\d{5,19}");
    }

    //不运用正则表达式
    private static boolean checkQQ(String s) {
        if(s==null || s.startsWith("0") || s.length()<6 || s.length()>20){
            return false;
        }
        //执行到这里,说明不为空且开头不为0,长度在6-20之间
        //接下来要判断都是数字
        for (int i = 0; i < s.length(); i++) {
            //根据索引i提取当前位置的字符
            char c = s.charAt(i);
            if(c < '0' || c > '9'){
                return false;
            }
        }
        //执行到这里,说明都是数字
        return true;
    }
}

2.2 书写规则

public class demo {
    public static void main(String[] args) {
        // 1、字符类(只能匹配单个字符)
        System.out.println("a".matches("[abc]"));  // [abc]只能匹配a、b、c
        System.out.println("e".matches("[abcd]")); // false

        System.out.println("d".matches("[^abc]"));   // [^abc] 不能是abc
        System.out.println("a".matches("[^abc]"));  // false

        System.out.println("b".matches("[a-zA-Z]")); // [a-zA-Z] 只能是a-z A-Z的字符
        System.out.println("2".matches("[a-zA-Z]")); // false

        System.out.println("k".matches("[a-z&&[^bc]]")); // : a到z,除了b和c
        System.out.println("b".matches("[a-z&&[^bc]]")); // false

        System.out.println("ab".matches("[a-zA-Z0-9]")); // false 注意:以上带 [内容] 的规则都只能用于匹配单个字符

        // 2、预定义字符(只能匹配单个字符)  .  \d  \D   \s  \S  \w  \W
        System.out.println("徐".matches(".")); // .可以匹配任意字符(只能匹配单个)
        System.out.println("徐徐".matches(".")); // false

        //在Java中\是有特殊用途的,例如特殊字符 \n \t,因此希望是\的时候需要用\\
        // \转义
        System.out.println("\"");  //输出"
        // \n \t
        System.out.println("3".matches("\\d"));  // \d: 代表0-9
        System.out.println("a".matches("\\d"));  //false

        System.out.println(" ".matches("\\s"));   // \s: 代表一个空白字符
        System.out.println("a".matches("\\s")); // false

        System.out.println("a".matches("\\S"));  // \S: 代表一个非空白字符
        System.out.println(" ".matches("\\S")); // false

        System.out.println("a".matches("\\w"));  // \w: [a-zA-Z_0-9]
        System.out.println("_".matches("\\w")); // true
        System.out.println("1".matches("\\w")); //true
        System.out.println("徐".matches("\\w")); // false

        System.out.println("徐".matches("\\W"));  // [^\w]不能是a-zA-Z_0-9
        System.out.println("a".matches("\\W"));  // false

        System.out.println("23232".matches("\\d")); // false 注意:以上预定义字符都只能匹配单个字符。

        // 3、数量词: ?   *   +   {n}   {n, }  {n, m}
        System.out.println("a".matches("\\w?"));   // ? 代表0次或1次
        System.out.println("".matches("\\w?"));    // true
        System.out.println("abc".matches("\\w?")); // false

        System.out.println("abc12".matches("\\w*"));   // * 代表0次或多次
        System.out.println("".matches("\\w*"));        // true
        System.out.println("abc12张".matches("\\w*")); // false(\w不能匹配中文)

        System.out.println("abc12".matches("\\w+"));   // + 代表1次或多次
        System.out.println("".matches("\\w+"));       // false(+ 代表1次或多次,不能是0次)
        System.out.println("abc12张".matches("\\w+")); // false(\w不能匹配中文)

        System.out.println("a3c".matches("\\w{3}"));   // {3} 代表要正好是n次
        System.out.println("abcd".matches("\\w{3}"));  // false(大于3次)

        System.out.println("abcd".matches("\\w{3,}"));     // {3,} 代表是>=3次
        System.out.println("ab".matches("\\w{3,}"));     // false(小于3次)
        System.out.println("abcde徐".matches("\\w{3,}"));     // false(\w不能匹配中文)

        System.out.println("abc232d".matches("\\w{3,9}"));     // {3, 9} 代表是  大于等于3次,小于等于9次

        // 4、其他几个常用的符号:(?i)忽略大小写 、 或:| 、  分组:()
        System.out.println("abc".matches("(?i)abc")); // true
        System.out.println("ABC".matches("(?i)abc")); // true
        System.out.println("aBc".matches("a((?i)b)c")); // true
        System.out.println("ABc".matches("a((?i)b)c")); // false

        // 需求1:要求要么是3个小写字母,要么是3个数字。
        System.out.println("abc".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("ABC".matches("[a-z]{3}|\\d{3}")); // false
        System.out.println("123".matches("[a-z]{3}|\\d{3}")); // true
        System.out.println("A12".matches("[a-z]{3}|\\d{3}")); // false

        // 需求2:必须是”我爱“开头,中间可以是至少一个”编程“,最后至少是1个”666“
        System.out.println("我爱编程编程666666".matches("我爱(编程)+(666)+"));  //true
        System.out.println("我爱编程编程66666".matches("我爱(编程)+(666)+"));  //false
    }
}

 2.3 应用案例

public class demo {
    public static void main(String[] args) {
        //checkPhone();
        //checkEmail();
        checkTime();
    }

    private static void checkPhone() {
        while (true) {
            System.out.println("请输入您的电话号码(手机|座机):");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();  //nextLine()用来接收一行数据
            //校验手机号码的正则表达式
            if(phone.matches("(1[3-9]\\d{9})|(0\\d{2,3}-?[1-9]\\d{6,7})")){
                System.out.println("您输入的电话号码格式正确");
                break;
            }else{
                System.out.println("您输入的电话号码格式不正确");
            }
        }
    }

    private static void checkEmail() {
        while (true) {
            System.out.println("请输入您的邮箱:");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();  //nextLine()用来接收一行数据
            //校验邮箱的正则表达式
            if(phone.matches("\\w{2,}@\\w{2,10}(\\.\\w{2,10}){1,2}")){
                System.out.println("您输入的邮箱格式正确");
                break;
            }else{
                System.out.println("您输入的邮箱格式不正确");
            }
        }
    }

    private static void checkTime() {
        while (true) {
            System.out.println("请输入需要校验的时间(xx:xx:xx):");
            Scanner sc = new Scanner(System.in);
            String phone = sc.nextLine();  //nextLine()用来接收一行数据
            //校验邮箱的正则表达式
            if(phone.matches("(([0-9])|(1[0-9])|(2[0-3]))\\:[0-5][0-9]\\:[0-5][0-9]")){
                System.out.println("您输入的时间格式正确");
                break;
            }else{
                System.out.println("您输入的时间格式不正确");
            }
        }
    }
}

2.4 用于查找信息

public class demo {
    public static void main(String[] args) {
        //需求:从以下内容中爬取出,手机,邮箱,座机、400电话等信息。
        String data = " 来学习Java,\n" +
                "        电话:1866668888,18699997777\n" +
                "        或者联系邮箱:boniu@qq.com,\n" +
                "        座机电话:01036517895,010-98951256\n" +
                "        邮箱:bozai@wosun.cn,\n" +
                "        邮箱:0_009@163.com,\n" +
                "        热线电话:400-618-9090 ,400-618-4000,4006184000,4006189090";
        //定义爬取规则
        //手机号:1开头,第二位是3-9,剩下9位是0-9
        //座机号:
        // 区号是0开头,可能是3位或4位。
        // -可有可无
        // 座机号是7或8位,不能是0开头
        //邮箱:必须有@,@前要有两个及以上的字符,@后要有至少2个最多10个字符,最后至少接上一组.和两个以上的字符(如123@123.com)
        //热线电话:400开头,后接一组3位数和一组4位数,中间的-可有可无
            //正则表达式中不能随意写空格,会导致结果不对
        String regex = "(1[3-9]\\d{9})|(0\\d{2,3}-?[1-9]\\d{6,7})|(\\w{2,}@\\w{2,10}(\\.\\w{2,10}){1,2})|(400-?\\d{3}-?\\d{4})";

        //把正则表达式封装成一个Pattern对象
        Pattern pattern = Pattern.compile(regex);
        //通过pattern对象去获取查找内容的匹配器对象
        Matcher matcher = pattern.matcher(data);
        //定义一个循环开始爬取信息
        while(matcher.find()){
            String rs = matcher.group();  //获取找到的内容
            System.out.println(rs);
        }
    }
}

 2.5 用于搜索替换、分割内容

        正则表达式用于搜索替换、分割内容,需要结合String提供的如下方法完成

方法名说明
public String replaceAll(String regex,String newStr)按照正则表达式匹配的内容进行替换
public String[] split(String regex);按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
public class demo {
    public static void main(String[] args) {
        //public String replaceAll(String regex,String newStr)	按照正则表达式匹配的内容进行替换
        // 需求:请把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴,中间的非中文字符替换成 “-”
        String s = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
        System.out.println(s.replaceAll("\\w+", "-"));

        // 需求:某语音系统,收到一个口吃的人说的“我我我喜欢编编编编编编编编编编编编程程程!”,需要优化成“我喜欢编程!”。
        String s2 = "我我我喜欢编编编编编编编编编编编编程程程!";
        /**
         * (.) :代表一组  .用来匹配任意字符
         * \\1 :为这个组声明一个组号:1号    分组引用
         * + :声明必须是重复的字
         * $1 :可以去取到第1组代表的那个重复的字
         */
        System.out.println(s2.replaceAll("(.)\\1+", "$1"));  //未接触过的知识

        //public String[] split(String regex);	按照正则表达式匹配的内容进行分割字符串,返回一个字符串数组
        //需求:请把 古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴,中的人名获取出来。
        String s3 = "古力娜扎ai8888迪丽热巴999aa5566马尔扎哈fbbfsfs42425卡尔扎巴";
        String[] arr = s3.split("\\w+");
        System.out.println(Arrays.toString(arr));
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1492779.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 ArcGIS Pro 统计四川省各市道路长度

在某些时候&#xff0c;我们需要进行分区统计&#xff0c;如果挨个裁剪数据再统计&#xff0c;不仅步骤繁琐、耗时&#xff0c;还会产生一些多余的数据&#xff0c;这里教大家如何在不裁剪数据的情况下统计四川各市的道路长度&#xff0c;希望能对你有所帮助。 数据来源 教程…

web前端之uniApp实现选择时间功能

MENU 1、孙子组件1.1、html部分1.2、JavaScript部分1.3、css部分 2、子组件2.1、html部分2.2、JavaScript部分2.3、css部分 3、父组件3.1、html部分3.2、JavaScript部分 4、效果图 1、孙子组件 1.1、html部分 <template><view><checkbox-group change"ch…

HashSet在添加元素时,是如何判断元素重复的? (原理详解 | 易错案例)

前言&#xff1a;我们知道Set中所存储的元素是不重复的&#xff0c;那么Set接口的实现类HashSet在添加元素时是怎么避免重复的呢&#xff1f; HashSet在添加元素时&#xff0c;是如何判断元素重复的? ● 在底层会先调用hashCode()&#xff0c;注意&#xff0c;Obje…

分享一个完全免费的GPT4站点,gpts也可以用

给大家分享一个完全免费的GPT4站点&#xff0c;gpts也可以用点击链接可用

板级PDN(电源分配网络)设计要点综述

目录 目标阻抗去耦方法 确定目标阻抗 确定目标频点 VRM 去耦电容 安装电感 平面电容 总结 去耦电容 PCB叠层设计 扩展阅读 目标阻抗去耦方法 确定PCB去耦方案的策略是使用频域目标阻抗法&#xff0c;通过层间电容和分立电容器组合的使用&#xff0c;保证电源轨阻抗在…

【MySQL】视图 -- 详解

视图 是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 一、基本使用 1、创建视图 create view 视图名 as select 语句; 好处&#xff1a;…

基于springboot+vue实现电子商务平台管理系统项目【项目源码+论文说明】

基于springboot实现电子商务平台管理系统演示 研究的目的和意义 据我国IT行业发布的报告表明&#xff0c;近年来&#xff0c;我国互联网发展呈快速增长趋势&#xff0c;网民的数量已达8700万&#xff0c;逼近世界第一&#xff0c;并且随着宽带的实施及降价&#xff0c;每天约有…

Node.js最准确历史版本下载(以下载Node.js16.17.1版本为例)

先进入官网:Node.js https://nodejs.org/en 括号中LTS代表稳定版本. 嫌其他冗余博客帖子多&#xff0c;找起来费眼睛,可以到/release下载:Node.js,在blog后面加/release https://nodejs.org/en/blog/release/ 点击next翻页,跟上面同样的步骤

吴恩达深度学习笔记:深度学习引言1.1-1.6

目录 第一门课&#xff1a;神经网络和深度学习 (Neural Networks and Deep Learning)第一周&#xff1a;深度学习引言(Introduction to Deep Learning)1.1 欢迎(Welcome)1.2 什么是神经网络&#xff1f;(What is a Neural Network) 第一门课&#xff1a;神经网络和深度学习 (Ne…

leetcode 3.5

普通数组 1.最大子数组和 最大子数组和 前缀和pre 动态规划 pre保留的是当前包含了当前遍历的最大的前缀和&#xff0c;如果之前的pre 对结果有增益效果&#xff0c;则 pre 保留并加上当前遍历, 如果pre 对结果无增益效果&#xff0c;需要舍弃&#xff0c;则 pre 直接更新为…

基于ZYNQ PS-SPI的Flash驱动开发

本文使用PS-SPI实现Flash读写&#xff0c;PS-SPI的基础资料参考Xilinx UG1085的文档说明&#xff0c;其基础使用方法是&#xff0c;配置SPI模式&#xff0c;控制TXFIFO/RXFIFO&#xff0c;ZYNQ的IP自动完成发送TXFIFO数据&#xff0c;接收数据到RXFIFO&#xff0c;FIFO深度为12…

整合力-整合思维模型和领导力

整合力和领导力是组织成功的两大关键因素。在当今复杂多变的商业环境中&#xff0c;整合力和领导力的结合对于推动组织发展至关重要。本文将探讨整合力和领导力的概念、重要性以及如何有效整合二者以促进组织的成功发展。 ### 整合力的重要性 整合力指的是组织内部各个部门、…

CSS字体样式的使用,前端开发手册

零基础学web前端开发要怎么去学? 首先要学习的就是基础知识&#xff1a;html、css和JavaScript。HTML是内容&#xff0c;CSS是表现&#xff0c;JavaScript是行为。前端开发的门槛其实非常低&#xff0c;与服务器端语言先慢后快的学习曲线相比&#xff0c;前端开发的学习曲线是…

java: Compilation failed: internal java compiler error或者构建时内存溢出解决办法

启动项目的时候出现了java: Compilation failed: internal java compiler error问题 解决办法 统一JDK版本 一、查看项目的jdk&#xff08;CtrlAltshiftS&#xff09;&#xff1a;File ->Project Structure ->Project Settings ->Project 二、查看工程的jdk&…

硬盘删除的文件如何恢复?分享硬盘数据恢复方法

随着信息时代的飞速发展&#xff0c;硬盘作为我们储存数据的主要场所其重要性日益凸显。但硬盘数据的丢失或误删也成为了许多用户头疼的问题。当您发现重要的文件从硬盘中消失时不必过于焦虑。本文将为您介绍五种高效且原创的数据恢复策略&#xff0c;帮助您找回那些珍贵的文件…

爬虫学习笔记-requests爬取NBA得分榜

1.导入requests库,用于请求获取URL位置的资源 import requests 2.导入lxml库,解析及生成xml和html文件 from lxml import etree 3.定义发送请求的地址 url https://nba.hupu.com/stats/players 4.定义请求头 headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64…

CSS如何清除默认样式,想学web开发

一面 css 如何实现垂直居中&#xff1f;position 有哪几种&#xff1f;分别说一下对应的效果和用法css 选择器优先级js 原型链&#xff0c;问了js 如何创建对象页面渲染和响应 式MVVM 和 MVC的区别Vue 生命周期&#xff0c;在哪个阶段可以获取页面 dom 信息Vue 的组件通信 &am…

CSS的三种定位,响应式web开发项目教程

标准文档流 文档流&#xff1a;指的是元素排版布局过程中 戳这里领取完整开源项目&#xff1a;【一线大厂前端面试题解析核心总结学习笔记Web真实项目实战最新讲解视频】 &#xff0c;元素会默认自动从左往右&#xff0c;从上往下的流式排列方式。并最终窗体自上而下分成一行行…

Spring框架的优点

Spring框架是一个开放源代码的J2EE应用程序框架&#xff0c;是针对bean的生命周期进行管理的轻量级容器。 Spring解决了开发者在J2EE开发中遇到的许多常见的问题&#xff0c;提供了功能强大的IOC、AOP及Web MVC等功能。 轻量级&#xff1a;相对于EJB框架而言。 Spring 体系结…

力扣543. 二叉树的直径

Problem: 543. 二叉树的直径 文章目录 题目描述思路复杂度Code 题目描述 思路 1.最大直径 左子树的最大深度 右子树的最大深度&#xff1b; 2.定义一个变量maxDiameter记录最大直径&#xff0c;并编写一个递归函数maxDepth&#xff0c;利用树的后序遍历每次递归求取leftMax&a…