备战蓝桥 算法·每日一题(详解+多解)-- 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
中从单词beginWord
和endWord
的 转换序列 是一个按下述规格形成的序列beginWord -> s1 -> s2 -> ... -> sk
:
每一对相邻的单词只差一个字母。
对于1 <= i <= k
时,每个si
都在wordList
中。注意,beginWord
不需要在wordList
中。
sk == endWord
给你两个单词beginWord
和endWord
和一个字典wordList
,返回 从beginWord
到endWord
的 最短转换序列 中的 单词数目 。如果不存在这样的转换序列,返回 0 。
class Solution
private List<String> baseList 备战蓝桥 算法·每日一题(详解+多解)-- day2