前言
哈哈哈,没想到吧,上一篇文章是补的周末合刊,而这篇才是今天的内容。从这里开始,才是我每天在蓝桥杯官网找的真题,由于我的算法基础并不好,所以我做的题大多都是易,但是我觉得也有学习意义,不积跬步无以至千里,不积小流无以成江海你。
主要内容
1
java
package com.njx.topic1;
import java.util.*;
public class Test7 {
public static void main(String[] args) {
//冰雹数
//任意给定一个正整数N
//如果是偶数,执行:N/2
//如果是奇数,执行:N×3+1
//生成的新的数字再执行同样的动作,循环往复。
//通过观察发现,这个数字会一会儿上升到很高,一会儿又降落下来。
//就这样起起落落的,但最终必会落到"1",这有点像小冰雹粒子在冰雹云中翻滚增长的样子。
//比如N=9
//9,28,14,7,22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1
//可以看到,N=9的时候,这个"小冰雹"最高冲到了52这个高度。
//scanner用法
//Scanner sc = new Scanner(System.in);
//int n = sc.nextInt();
//System.out.println(n);
//sc.close();
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
Set<Long> set = new HashSet<>();
//输入一个N
int N = scan.nextInt();
//对N进行处理,从不大于N的奇数开始
int n = N % 2 == 0 ? N - 1 : N;
//max存储能到达的最大值
long max = N;
//temp存储每次寻找的中间数
long temp;
//循环i的范围是[n,1)之间的奇数
for (int i = n; i > 1; i -= 2) {
//如果set里已经有i了,说明之前寻找过程中已经出现i,不必再寻找了
if (set.contains((long) i)) continue;
temp = i;
//寻找过程...
while (temp != 1 && !set.contains(temp)) {
set.add((temp));//对当前的temp,存进set
if (temp % 2 == 1) {
temp = temp * 3 + 1;
}
max = Math.max(max, temp);
while (temp % 2 == 0) {
temp /= 2;
}
}
}
System.out.println(max);
scan.close();
}
}
2
java
package com.njx.topic1;
import java.util.*;
public class Test8 {
public static void main(String[] args) {
//福尔摩斯从 X 星收到一份资料,全部是小写字母组成。
//他的助手提供了另一份资料:许多长度为 8 的密码列表。
//福尔摩斯发现,这些密码是被打乱后隐藏在先前那份资料中的。
//请你编写一个程序,从第一份资料中搜索可能隐藏密码的位置。要考虑密码的所有排列可能性。
//输入描述
//输入第一行:一个字符串 s 全部由小写字母组成,长度小于 1024*1024。
//紧接着一行是一个整数n表示以下有n 行密码,1≤n≤1000。
//紧接着是n行字符串,都是小写字母组成,长度都为 8。
//输出描述
//输出一个整数, 表示每行密码的所有排列在s 中匹配次数的总和。
//这是gpt的答案,未通过
Scanner sc = new Scanner(System.in);
// 第一份资料:长字符串
String S = sc.nextLine();
// 第二份资料:密码个数
int m = sc.nextInt();
sc.nextLine(); // 吃掉换行
while (m-- > 0) {
String P = sc.nextLine(); // 长度为 8 的密码
int[] cntP = new int[26];
int[] cntS = new int[26];
// 统计密码字母出现次数
for (char c : P.toCharArray()) {
cntP[c - 'a']++;
}
int len = S.length();
// 初始化第一个窗口
for (int i = 0; i < 8; i++) {
cntS[S.charAt(i) - 'a']++;
}
// 判断第一个窗口
if (Arrays.equals(cntP, cntS)) {
System.out.println(0);
}
// 滑动窗口
for (int i = 8; i < len; i++) {
// 加右边
cntS[S.charAt(i) - 'a']++;
// 去左边
cntS[S.charAt(i - 8) - 'a']--;
if (Arrays.equals(cntP, cntS)) {
System.out.println(i - 7);
}
}
}
sc.close();
}
}
//以下是蓝桥杯的代码分享,能通过,但是存在内存溢出等问题
//import java.util.Arrays;
//import java.util.Scanner;
//
//public class Main {
// public static void main(String[] args) {
// Scanner sc = new Scanner(System.in);
//
// // 读取第一行输入的字符串 s
// String s = sc.nextLine();
//
// // 如果字符串 s 的长度小于 8,则直接输出 0 并返回
// if (s.length() < 8) {
// System.out.println(0);
// return;
// }
//
// // 读取整数 n
// int n = sc.nextInt();
//
// // 读取换行符,确保下一次读取的是字符串
// sc.nextLine();
//
// // 初始化答案变量
// int ans = 0;
//
// // 循环处理 n 个字符串
// while (n-- > 0) {
// // 读取一个字符串并转换为字符数组
// char[] t = sc.nextLine().toCharArray();
//
// // 对字符数组进行排序
// Arrays.sort(t);
//
// // 遍历字符串 s 的所有长度为 8 的子串
// for (int j = 0; j <= s.length() - 8; j++) {
// // 获取长度为 8 的子串并转换为字符数组
// char[] temp = s.substring(j, j + 8).toCharArray();
//
// // 对子串进行排序
// Arrays.sort(temp);
//
// // 如果排序后的子串与 t 相等,则增加答案计数
// if (Arrays.equals(temp, t)) {
// ans++;
// }
// }
// }
//
// // 输出最终的答案
// System.out.println(ans);
// }
//}
3
java
package com.njx.topic1;
import java.util.*;
public class Test9 {
public static void main(String[] args) {
//乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊 C 型饮料,凭 3 个瓶盖可以再换一瓶 C 型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
//请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
//输入描述
//输入一个整数n(0<n<1000),表示开始购买的饮料数量。
//输出描述
//输出一个整数,表示实际得到的饮料数
//简单
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 初始购买的饮料数
int total = n; // 总共喝到的饮料数
int caps = n; // 当前瓶盖数
// 只要还能兑换
while (caps >= 3) {
int exchange = caps / 3; // 本轮能换几瓶
total += exchange; // 喝掉这些
caps = caps % 3 + exchange; // 剩余瓶盖 + 新瓶盖
}
System.out.println(total);
sc.close();
}
}
4
java
package com.njx.topic1;
import java.util.*;
public class Test10 {
public static void main(String[] args) {
//在数列 α1,α2,···,αn 中,如果对于下标i, j,k 满足 0 <i < j <k<n+ 1且a <aj < ak,则称a,aj,ak为-组递增三元组,α; 为递增三元组的中心。
//给定一个数列,请问数列中有多少个元素可能是递增三元组的中心。
//输入描述
//输入的第一行包含一个整数n。
//第二行包含n个整数α1,α2,···,αn,相邻的整数间用空格分隔,表示给定的数列。
//其中,2≤n≤ 1000,0≤ 数列中的数≤10000。
//输出描述
//输出一行包含一个整数,表示答案。
//只要左右都有符合左小右大即可,不要求紧挨着
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
int ans = 0;
// 枚举中心位置 j
for (int j = 1; j <= n - 2; j++) {
boolean hasSmallerLeft = false;
boolean hasLargerRight = false;
// 左边找 a[i] < a[j]
for (int i = 0; i < j; i++) {
if (a[i] < a[j]) {
hasSmallerLeft = true;
break;
}
}
// 右边找 a[k] > a[j]
for (int k = j + 1; k < n; k++) {
if (a[k] > a[j]) {
hasLargerRight = true;
break;
}
}
if (hasSmallerLeft && hasLargerRight) {
ans++;
}
}
System.out.println(ans);
sc.close();
}
}
最后一语
这几道题也废了我不少时间,主要有些题目感觉很简单却容易忽视内存和所有的条件,还有就是要记住模板,在后面的几期我尽量找专题模板去做,加深处理能力,和背模板。
愿我们有远大梦想,愿我们的葫芦盛满水,愿风为我们吹,水为我们流,愿爱指挥我们。
------ 鲁米 《愿我们有远大梦想》
感谢观看,共勉!!