备战蓝桥 算法·每日一题(详解+多解)-- day3

Posted 苏州程序大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了备战蓝桥 算法·每日一题(详解+多解)-- day3相关的知识,希望对你有一定的参考价值。

【备战蓝桥】 算法·每日一题(详解+多解)-- day3

✨博主介绍

🌊 作者主页:苏州程序大白

🌊 作者简介:🏆CSDN人工智能域优质创作者🥇,苏州市凯捷智能科技有限公司创始之一,目前合作公司富士康、歌尔等几家新能源公司

💬如果文章对你有帮助,欢迎关注、点赞、收藏

💅 有任何问题欢迎私信,看到会及时回复
💅关注苏州程序大白,分享粉丝福利

第一题

题目描述:

给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。

class Solution 
    int[]arr;
    public Solution(int[] nums) 
    arr=nums.clone();
    
    
    public int pick(int target) 
    int count=0;
        for(int i=0;i<arr.length;i++)
            if(arr[i]==target) count++;
        
        int choose=new Random().nextInt(count)+1;
        count=0;
        for(int i=0;i<arr.length;i++)
            if(arr[i]==target)
                count++;
                if(count==choose) return  i;
            
        
        return  -1;
    

第二题

题目描述:

寻找两个正序数组的中位数,给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。

class Solution 
    public double findMedianSortedArrays(int[] nums1, int[] nums2) 
   int m = nums1.length;
        int n = nums2.length;
        int left = (m + n + 1) / 2;
        int right = (m + n + 2) / 2;
        return (findKth(nums1, 0, nums2, 0, left) + findKth(nums1, 0, nums2, 0, right)) / 2.0;
    
    //i: nums1的起始位置 j: nums2的起始位置
    public int findKth(int[] nums1, int i, int[] nums2, int j, int k)
        if( i >= nums1.length) return nums2[j + k - 1];//nums1为空数组
        if( j >= nums2.length) return nums1[i + k - 1];//nums2为空数组
        if(k == 1)
            return Math.min(nums1[i], nums2[j]);
        
        int midVal1 = (i + k / 2 - 1 < nums1.length) ? nums1[i + k / 2 - 1] : Integer.MAX_VALUE;
        int midVal2 = (j + k / 2 - 1 < nums2.length) ? nums2[j + k / 2 - 1] : Integer.MAX_VALUE;
        if(midVal1 < midVal2)
            return findKth(nums1, i + k / 2, nums2, j , k - k / 2);
        else
            return findKth(nums1, i, nums2, j + k / 2 , k - k / 2);
                
    

第三题

题目描述:

正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。
. 匹配任意单个字符
* 匹配零个或多个前面的那一个元素
所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。

class Solution 
    public boolean isMatch(String s, String p)
       return db(s,p,0,0);
    
   
    /***
     * s 原字符串
     * p 正则表达式
     * sindex s的指针
     * pindex p的指针
     *  当 s指针和p指针都指到了末尾了 就结束了
     * @return
     */
    public boolean db(String s, String p,int sindex,int pindex)
        //超出长度
        if(sindex < s.length() && pindex < p.length())
            //相等的话 返回true
            if(s.charAt(sindex) == p.charAt(pindex) || p.charAt(pindex) == '.')
                //往下继续判断 没有到最后一个
                if(pindex < p.length()-1)
                    //判断后一位是否为*
                    //取到下一位的数字
                    char next = p.charAt(pindex+1);
                    if(next == '*')
                        //匹配到了 三种可能 1 一个也不匹配 2 匹配一个 3 匹配多个
                        return db(s,p,sindex,pindex+2) || db(s,p,sindex+1,pindex+2)|| db(s,p,sindex+1,pindex);
                    else
                        //往下走
                        return db(s,p,sindex +1,pindex+1);
                    
                else
                    //最后一个了
                    if(sindex == s.length()-1)
                        return true;
                    else
                        return false;
                    
                
            else
                //不相等
               if(pindex < p.length()-1)
                    //判断后一位是否为*
                    //取到下一位的数字
                    char next = p.charAt(pindex+1);
                    if(next == '*')
                        //1 一个也不匹配
                        return db(s,p,sindex,pindex+2);
                    else 
                        //不相等
                        return false;
                    
                else 
                    //不相等
                    return false;
                
            
        else
            //超出长度了
            if(sindex == s.length())
                if(pindex == p.length())
                    return true;
                else 
                    //p 没有匹配完 判断后一位是不是 *
                    if(pindex < p.length()-1)
                        //判断后一位是否为*
                        //取到下一位的数字
                        char next = p.charAt(pindex + 1);
                        if (next == '*') 
                            //1 一个也不匹配
                            return db(s, p, sindex, pindex + 2);
                         else 
                            //不相等
                            return false;
                        
                     else 
                        //不相等
                        return false;
                    
                
            else
                return false;
            
        
    

第四题

题目描述:

编写一个程序,通过填充空格来解决数独问题。
数独的解法需 遵循如下规则:
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)
数独部分空格内已填入了数字,空白格用 ‘.’ 表示。

class Solution 
    public void solveSudoku(char[][] board) 
 /**
         * 记录某行,某位数字是否已经被摆放
         */
        boolean[][] row = new boolean[9][9];
        /**
         * 记录某列,某位数字是否已经被摆放
         */
        boolean[][] col = new boolean[9][9];
        /**
         * 记录某 3x3 宫格内,某位数字是否已经被摆放
         */
        boolean[][] block = new boolean[9][9];

        for (int i = 0; i < 9; i++) 
            for (int j = 0; j < 9; j++) 
                if (board[i][j] != '.') 
                    int num = board[i][j] - '1';
                    row[i][num] = true;
                    col[j][num] = true;
                    // blockIndex = i / 3 * 3 + j / 3,取整
                    block[i / 3 * 3 + j / 3][num] = true;
                
            
        
        dfs(board, row, col, block, 0, 0);
    

    private boolean dfs(char[][] board, boolean[][] row, boolean[][] col, boolean[][] block, int i, int j) 
        // 找寻空位置
        while (board[i][j] != '.') 
            if (++j >= 9) 
                i++;
                j = 0;
            
            if (i >= 9) 
                return true;
            
        
        for (int num = 0; num < 9; num++) 
            int blockIndex = i / 3 * 3 + j / 3;
            if (!row[i][num] && !col[j][num] && !block[blockIndex][num]) 
                // 递归
                board[i][j] = (char) ('1' + num);
                row[i][num] = true;
                col[j][num] = true;
                block[blockIndex][num] = true;
                if (dfs(board, row, col, block, i, j)) 
                    return true;
                 else 
                    // 回溯
                    row[i][num] = false;
                    col[j][num] = false;
                    block[blockIndex][num] = false;
                    board[i][j] = '.';
                
            
        
        return false;
    

    private void printBoard(char[][] board) 
        for (int i = 0; i < 9; i++) 
            for (int j = 0; j < 9; j++) 
                System.out.print(board[i][j] + " ");
            
            System.out.println();
        
    

    public static void main(String[] args) 
        char[][] board = new char[][]
                '5', '3', '.', '.', '7', '.', '.', '.', '.',
                '6', '.', '.', '1', '9', '5', '.', '.', '.',
                '.', '9', '8', '.', '.', '.', '.', '6', '.',
                '8', '.', '.', '.', '6', '.', '.', '.', '3',
                '4', '.', '.', '8', '.', '3', '.', '.', '1',
                '7', '.', '.', '.', '2', '.', '.', '.', '6',
                '.', '6', '.', '.', '.', '.', '2', '8', '.',
                '.', '.', '.', '4', '1', '9', '.', '.', '5',
                '.', '.', '.', '.', '8', '.', '.', '7', '9'
        ;
        Solution solution = new Solution();
        solution.printBoard(board);
        solution.solveSudoku(board);
        solution.printBoard(board);
    

第五题

题目描述:

单词接龙:字典 wordList 中从单词 beginWordendWord 的 转换序列 是一个按下述规格形成的序列 beginWord -> s1 -> s2 -> ... -> sk
每一对相邻的单词只差一个字母。
对于 1 <= i <= k 时,每个si都在wordList中。注意, beginWord 不需要在wordList 中。
sk == endWord
给你两个单词beginWordendWord和一个字典 wordList ,返回 从 beginWord endWord的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。

class Solution 
    private List<String> baseList 备战蓝桥 算法·每日一题(详解+多解)-- day2

备战蓝桥杯 算法·每日一题(详解+多解)-- day12

备战蓝桥 算法·每日一题(详解+多解)-- day3

大战蓝桥杯 算法·每日一题(详解+多解)-- day8

大战蓝桥杯 算法·每日一题(详解+多解)-- day10

迎战蓝桥杯 算法·每日一题(详解+多解)-- day7