• [java刷算法]牛客—剑指offer插入排序、双指针解题



    ✨今日三剑

    JZ20 表示数值的字符串
    JZ21 调整数组顺序使奇数位于偶数前面(一)
    JZ22 链表中倒数最后k个结点



    JZ20 表示数值的字符串

    题目描述

    在这里插入图片描述
    在这里插入图片描述

    思路详解

    看到是个字符串,那么我们就使用一个遍历字符串的全局变量作为下标,然后遍历字符串依次检查每个字符,根据字符属于的类型进行判断。

    • step 1:先判断空串的情况。
    • step 2:遍历字符前面的空格,将下标移到第一个不是空格的位置。遍历字符串后面的空格,将长度限制在最后一个空格。若是长度小于下标,说明全是空格。
    • step 3:剩余部分判断,开始找数字,判断是不是一个有符号的整数,优先判断符号,直到遇到非数字停止。
    • step 4:如果有小数点,那么开始判断小数点后是不是一个无符号的整数,也是遍历直到遇到非数字为止,出现小数点的话,小数点前和小数点后的数字任意有一即可。
    • step 5:若是出现字母e或者E,那么需要判断后面是不是一个有符号的整数,,也是遍历直到遇到非数字为止,e前后都要数字。
    • step 6:最后检查下标是不是遍历到了刚刚限制的长度,若是没有,说明后面还有非空格,不符合要求。

    代码与结果

    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param str string字符串 
         * @return bool布尔型
         */
         //遍历字符串的下标
        private int index = 0;
        //有符号判断
        private boolean integer(String s){
            if(index < s.length() && (s.charAt(index) == '-' || s.charAt(index) == '+'))
                index++;
            return unsigned_integer(s);
        }
        //无符号数判断
        private boolean unsigned_integer(String s){
            int temp = index;
            while(index < s.length() && (s.charAt(index) >= '0' && s.charAt(index) <= '9'))
                index++;
            return index > temp;
        }
        public boolean isNumeric (String str) {
            //先判断空串
            if(str == null || str.length() == 0)
                return false;
            //去除前面的空格
            while(index < str.length() && str.charAt(index) == ' ')
                index++;
            int n = str.length() - 1;
            //去除字符串后面的空格
            while(n >= 0 && str.charAt(n) == ' ')
                n--;
            //限制的长度比下标1
            n++;
            //全是空格情况
            if(n < index)
                return false;
            //判断前面的字符是否是有符号的整数
            boolean flag = integer(str);
            //如果有小数点
            if(index < n && str.charAt(index) == '.'){
                index++;
                //小数点前后有无数字可选
                flag = unsigned_integer(str) || flag;
            }
            //如果有e
            if(index < n && (str.charAt(index) == 'e' || str.charAt(index) == 'E')){
                index++;
                //e后面必须全是整数
                flag = flag && integer(str);
            }
            //是否字符串遍历结束
            return flag && (index == n);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    在这里插入图片描述

    JZ21 调整数组顺序使奇数位于偶数前面(一)

    题目描述

    在这里插入图片描述
    在这里插入图片描述

    思路详解

    这里我们可以使用插入排序的思想进行解题,我们只需关注奇数就好,每次遇到奇数就进行移位。这里加入插入排序的动画。

    在这里插入图片描述

    代码与实现

    import java.util.*;
    
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param array int整型一维数组 
         * @return int整型一维数组
         */
        //使用插入排序的思想
        public int[] reOrderArray (int[] array) {
            // 首先是对数值长度进行特判
            if(array==null||array.length==0) return array;
              //记录已经是奇数的位置
            int j=0;
            int temp = 0;
            for(int i =0;i<array.length;i++){
                temp = array[i];
                //如果该值为偶数
                if(array[i]%2==0){
                    continue;
                }else{//该值为奇数
                    int k =i;
                    while(k>j){
                        //这区间整体向后移动一位
                        array[k] = array[k-1];
                        k--;
                    }
                    //移位之后将对应的值赋值
                    array[k] = temp;
                    j++;
                }
            }
            //返回结果数数组
            return array;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在这里插入图片描述

    JZ22 链表中倒数最后k个结点

    题目描述

    在这里插入图片描述
    在这里插入图片描述

    思路详解

    本题的思路使用双指针进行解题。
    第一个指针先移动k步,然后第二个指针再从头开始,这个时候这两个指针同时移动,当第一个指针到链表的末尾的时候,返回第二个指针即可。注意,如果第一个指针还没走k步的时候链表就为空了,我们直接返回null即可。

    代码与结果

    import java.util.*;
    
    /*
     * public class ListNode {
     *   int val;
     *   ListNode next = null;
     *   public ListNode(int val) {
     *     this.val = val;
     *   }
     * }
     */
    
    public class Solution {
        /**
         * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
         *
         * 
         * @param pHead ListNode类 
         * @param k int整型 
         * @return ListNode类
         */
        public ListNode FindKthToTail(ListNode pHead, int k) {
        if (pHead == null)
            return pHead;
        ListNode first = pHead;
        ListNode second = pHead;
        //第一个指针先走k步
        while (k-- > 0) {
            if (first == null)
                return null;
            first = first.next;
        }
        //然后两个指针在同时前进
        while (first != null) {
            first = first.next;
            second = second.next;
        }
        return second;
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    在这里插入图片描述


    原创不易,还希望各位大佬支持一下 \textcolor{blue}{原创不易,还希望各位大佬支持一下} 原创不易,还希望各位大佬支持一下

    点赞,你的认可是我创作的动力! \textcolor{green}{点赞,你的认可是我创作的动力!} 点赞,你的认可是我创作的动力!

    收藏,你的青睐是我努力的方向! \textcolor{green}{收藏,你的青睐是我努力的方向!} 收藏,你的青睐是我努力的方向!

    评论,你的意见是我进步的财富! \textcolor{green}{评论,你的意见是我进步的财富!} 评论,你的意见是我进步的财富!

  • 相关阅读:
    VRRP 虚拟路由器冗余协议的解析和配置
    A component required a bean of type ‘XXX‘ that could not be found
    centos搭建docker镜像Harbor仓库的简明方法
    【线性代数】【一】1.5 矩阵的逆
    【Python】使用Python连接ClickHouse进行批量数据写入
    Ubuntu安装zsh并配置ohmyzsh
    网络编程之:TCP服务器的简单实现
    2023 江西省赛 【9.26训练补题】
    电子企业MES管理系统实施的功能和流程有哪些
    电力电缆故障技术与解决
  • 原文地址:https://blog.csdn.net/muzi_longren/article/details/126497102