大家好,我是snippet,今天是刷蓝桥真题的第二十四天,下面是我今天的题解
目录
一、旋转
题目内容:
题目描述
图片旋转是对图片最简单的处理方式之一,在本题中,你需要对图片顺时针旋转 90 度。
我们用一个 n×m 的二维数组来表示一个图片,例如下面给出一个 3×43×4 的 图片的例子:
1 3 5 7
9 8 7 6
3 5 9 7
这个图片顺时针旋转 90 度后的图片如下:
3 9 1
5 8 3
9 7 5
7 6 7
给定初始图片,请计算旋转后的图片。
输入描述
输入的第一行包含两个整数 n,m,分别表示行数和列数。
接下来 n 行,每行 m 个整数,表示给定的图片。图片中的每个元素(像 素)为一个值为 0 至 255 之间的整数(包含 0 和 255)。
输出描述
输出 m 行 n 列,表示旋转后的图片。
输入输出样例
示例
输入
3 4
1 3 5 7
9 8 7 6
3 5 9 7
输出
3 9 1
5 8 3
9 7 5
7 6 7运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路:
行输入,列输出
代码:
package 蓝桥杯31天真题冲刺.Day24;
import java.io.*;
/**
* @author snippet
* @data 2023-03-27
* 旋转-蓝桥云课
*/
public class T1_旋转 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int n,m;
static int N = 300;
static int[][] arr = new int[N][N];
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
n = Integer.parseInt(s[0]);
m = Integer.parseInt(s[1]);
for (int i = 1; i <= n; i++) {
s = br.readLine().split(" ");
for (int j = 1; j <= m; j++) {
arr[i][j] = Integer.parseInt(s[j-1]);
}
}
for (int i = 1; i <= m; i++) {
for (int j = n; j >= 1; j--) {
pw.print(arr[j][i] + " ");
}
pw.println();
}
pw.flush();
br.close();
}
}
二、附近最小
题目内容:
问题描述
小蓝有一个序列 a[1],a[2],...,a[n]。
给定一个正整数 k,请问对于每一个 11 到 n 之间的序号 i,...,a[i−k],a[i−k+1],...,a[i+k] 这 2k+1 个数中的最小值是多少?
当某个下标超过 1 到 n 的范围时,数不存在,求最小值时只取存在的那些值。
输入格式
输入的第一行包含一整数 n。
第二行包含 n 个整数,分别表示 a[1],a[2],...,a[n]。
第三行包含一个整数 k 。
输出格式
输出一行,包含 n 个整数,分别表示对于每个序号求得的最小值。
样例输入
5
5 2 7 4 3
1样例输出
2 2 2 3 3
评测用例规模与约定
对于 30% 的评测用例,1<=n<=1000,1<=a[i]<=1000。
对于 50% 的评测用例,1<=n<=10000,1<=a[i]<=10000。
对于所有评测用例,1<=n<=1000000,1<=a[i]<=1000000。
运行限制
语言 最大运行时间 最大运行内存 C++ 1s 256M C 1s 256M Java 3s 256M Python3 12s 512M
解题思路:
这个题考查的是单调队列,我们将每个队列里面的数控制为该数在1 <--> 2k+1之间,如果这个数已经不满足遍历的数的区间则从头出 如果是满足的从尾进 输出的时候遍历双端队列的头
代码:
package 蓝桥杯31天真题冲刺.Day24;
import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;
/**
* @author snippet
* @data 2023-03-27
* 附近最小-蓝桥云课
*/
// 单调队列
public class T2_附近最小 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
static int n,k;
static int N = 2000100;
static int[] arr = new int[N];
public static void main(String[] args) throws IOException {
String[] s = br.readLine().split(" ");
n = Integer.parseInt(s[0]);
s = br.readLine().split(" ");
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(s[i]);
}
k = Integer.parseInt(br.readLine().split(" ")[0]);
Deque<Integer> deque = new ArrayDeque<>();
deque.offerLast(arr[0]);
// 2k+1个数中的最小值
for (int i = 1; i <= k; i++) {
while (!deque.isEmpty() && deque.peekLast() > arr[i]) deque.pollLast();
deque.offerLast(arr[i]);
}
for (int i = 0; i < n; i++) {
pw.print(deque.peekFirst() + " ");
while (!deque.isEmpty() && i + k + 1 < n && deque.peekLast() > arr[i + k + 1]) deque.pollLast();
deque.offerLast(arr[i + k + 1]);
if (i - k >= 0 && deque.peekFirst() == arr[i - k]) deque.pollFirst();
}
pw.flush();
br.close();
}
}
三、扫地机器人
题目链接:扫地机器人 - 蓝桥云课 (lanqiao.cn)