【蓝桥杯-刷题篇】基础知识运用
🍓系列专栏:蓝桥杯
🍉个人主页:个人主页
目录
1.查找两个总和为特定值的索引
题目链接:查找两个总和为特定值的索引 - 蓝桥云课 (lanqiao.cn)
题目描述
给定一个数组,找到两个总和为特定值的索引。
例如给定数组 [1, 2, 3, -2, 5, 7],给定总和 7,则返回索引 [1, 4]。
若有多组符合情况则输出索引对中小索引最小的一组。
输入描述
第一行为给定数组的长度,不超过 100。
第二行为数组元素,元素大小不超过 100(可能为负数)。
第三行为特定值。
输出描述
输出一行,为两个索引值,升序输出。
输入
6 1 2 3 -2 5 7 7
输出
1 4
方法1:暴力枚举
public class Main {
public static void main(String[] args) {
int[] a=new int[110];
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=0;i<n;i++) {
a[i]=sc.nextInt();
}
int target=sc.nextInt();
twoSum(a,target);
}
/**
* 该方法用于查找两个数,使它们的和等于给定的目标值
* @param nums 给定的数组
* @param target 给定的目标值
*/
public static void twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] == target) {
System.out.println(i+" "+j);
return ;
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
}
方法2:HashMap
知识点:【蓝桥杯-筑基篇】HashMap
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int[] a=new int[110]; //定义一个长度为110的整型数组a
Scanner sc=new Scanner(System.in); //创建一个Scanner对象
int n=sc.nextInt(); //读取一个整数n
HashMap<Integer,Integer> map=new HashMap<>(); //创建一个HashMap对象
for(int i=0;i<n;i++) { //循环n次
a[i]=sc.nextInt(); //读取一个整数并存入数组a中
map.put(a[i], i); //将a[i]和i存入HashMap中
}
int target=sc.nextInt(); //读取一个整数target
for(int j=0;j<n;j++) { //循环n次
int A=a[j]; //将a[j]赋值给A
if(map.containsKey(target-A)) { //如果HashMap中包含target-A
System.out.println(j+" "+map.get(target-A)); //输出j和HashMap中target-A对应的值
return; //结束程序
}
}
}
}
6
1 2 3 -2 5 7
7
1 4
2.寻找 3 个数的最大乘积
题目链接:寻找 3 个数的最大乘积 - 蓝桥云课 (lanqiao.cn)
输入
6
5 -2 3 1 -1 4
输出
60
import java.util.Arrays;
import java.util.Scanner;
/**
* 实现一个算法在数组中找到 3 个数字的最大乘积。
* 介绍如下:
* 例如数组 [5, -2, 3, 1, -1, 4] 中 3 个数字的最大乘积为 60
*
*/
public class Main {
/**
* 可以使用数组接收所需要的计算的所有的数据,然后利用
* <code>Arrays.sort()</code>函数对数组内容进行排序
* @param args
*/
public static void main(String[] args) {
/*
* 为了能让所得成绩数量最大,我们应当保证所得数尽量为正数。
* 并且要让这三个数的绝对值尽可能大。
* 有如下两种情况能尽量使得所得结果正数,且绝对值最大:
* (1) 正数*正数*正数
* (2)负数*负数*正数
*/
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] data = new int[n];
for (int i = 0; i < n; i++) {
data[i] = scanner.nextInt();
}
Arrays.sort(data);
int result = Math.max(data[n-1]*data[n-2]*data[n-3], data[n-1]*data[0]*data[1]);
System.out.println(result);
}
}
3.字符统计
时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
给定一个只包含大写字母的字符串 S ,请你输出其中出现次数最多的字母。如果有多个字 母均出现了最多次,按字母表顺序依次输出所有这些字母。【输入格式】
一个只包含大写字母的字符串 S .【输出格式】
若干个大写字母,代表答案。【样例输入】
BABBACAC【样例输出】
AB【评测用例规模与约定】
对于 100% 的评测用例,1 ≤ |S | ≤
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
static int[] a=new int[26];
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
String s=sc.next();
for (int i = 0; i < s.length(); i++) {
a[s.charAt(i)-'A']++;
}
int max=0;
List<Integer> list=new ArrayList<>();
for (int i = 0; i < 26; i++) {
if (a[i]>max){
list.clear();
max=a[i];
list.add(i);
}else if (a[i]==max) list.add(i);
}
for (int i:list){
System.out.print((char)(i+'A'));
}
}
}
4.用杂志拼接信件
题目描述
实现一个算法确定能否由杂志构成信件。介绍如下:
影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。
杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否可以由杂志上的字符构成。
例如杂志为
ab
,信件为aa
,则不能构成。杂志为aab
,信件为aa
,则可以构成。输入描述
输入两行字符串,长度均不超过 100。
第一行为杂志字符串,第二行为信件字符串。
输出描述
输出一行,若信件可由杂志构成则输出
YES
,否则输出NO
。输入
ab aa
输出
NO
方法1:HashMap解决
知识点:【蓝桥杯-筑基篇】HashMap
import java.util.HashMap;
import java.util.Scanner;
// 导入必要的库
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String z=scan.next();
String x=scan.next();
HashMap<Character, Integer> mapz=new HashMap<>();
HashMap<Character, Integer> mapx=new HashMap<>();
// 创建两个哈希表以存储两个输入字符串中每个字符的频率
for (int i = 0; i < z.length(); i++) {
char c=z.charAt(i);
mapz.put(c, mapz.getOrDefault(c, 0)+1);
}
for (int i = 0; i < x.length(); i++) {
char c=x.charAt(i);
mapx.put(c, mapx.getOrDefault(c, 0)+1);
}
// 检查第一个字符串是否包含第二个字符串中的所有字符
for (char i = 'a'; i <= 'z'; i++) {
if(mapz.getOrDefault(i, 0)<mapx.getOrDefault(i, 0)) {
System.out.println("NO");
return ;
}
}
System.out.println("YES");
}
}
方法2:用数组存,和第三题思路一样
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
static int[] zazhi=new int[26];
static int[] xinjian=new int[26];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String z=scan.next();
String x=scan.next();
for (int i = 0; i < z.length(); i++) {
char c=z.charAt(i);
zazhi[c-'a']++;
}
for (int i = 0; i < x.length(); i++) {
char c=x.charAt(i);
xinjian[c-'a']++;
}
// System.out.println(Arrays.toString(zazhi));
// System.out.println(Arrays.toString(xinjian));
for (int i = 0; i < zazhi.length; i++) {
if(zazhi[i]<xinjian[i]) {
System.out.println("NO");
return ;
}
}
System.out.println("YES");
}
}
5.小蓝吃糖果
输入
3
4 1 1
输出
No
核心思想:数量最多的糖果数量 小于等于 糖果总数
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt(); // 读入整数个数
int x = 0; // 当前读入的整数
long sum = 0; // 所有整数的和
int max = 0; // 最大的整数
for (int i = 0; i < n; i++) {
x = scan.nextInt(); // 读入一个整数
sum += x; // 累加整数
max = Math.max(max, x); // 更新最大整数
}
if (max * 2 <= sum) { // 判断最大整数是否小于等于所有整数和的一半
System.out.println("Yes"); // 输出 Yes
} else {
System.out.println("No"); // 输出 No
}
}
}
6.含 2 天数
此方法适用于全部日期类
public class Main {
// 定义一个长度为13的数组,表示每个月的天数,第0个元素不使用
static int[] w = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 初始化年月日
static int y = 1900, m = 1, d = 1;
public static void main(String[] args) {
int ans = 0;
// 当年月日不为9999年12月31日时,循环继续
while (y != 9999 || m != 12 || d != 31) {
// 如果是闰年,2月有29天,否则有28天
w[2] = y % 4 == 0 && y % 100 != 0 || y % 400 == 0 ? 29 : 28;
// 如果年月日中有数字2,ans加1
if (check()) ans++;
d++;
// 如果日数超过当月天数,日数归1,月数加1
if (d > w[m]) {
d = 1;
m++;
}
// 如果月数超过12,月数归1,年数加1
if (m > 12) {
m = 1;
y++;
}
}
// 输出ans+1
System.out.println(ans + 1);
}
public static boolean check() {
int yy = y, mm = m, dd = d;
// 判断年月日中是否有数字2
while (yy > 0) {
if (yy % 10 == 2) return true;
yy /= 10;
}
while (mm > 0) {
if (mm % 10 == 2) return true;
mm /= 10;
}
while (dd > 0) {
if (dd % 10 == 2) return true;
dd /= 10;
}
return false;
}
}
7.完全日期
与第六题一样,只需根据题意改变check方法中的代码即可
public class Main {
static int[] w= {0,31,28,31,30,31,30,31,31,30,31,30,31}; // 定义每个月的天数
static int y=2001,m=1,d=1; // 初始化年月日
public static void main(String[] args) {
int ans=0; // 计数器
while(y!=2021||m!=12||d!=31) { // 循环直到日期为2021年12月31日
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) w[2] = 29; // 判断是否为闰年
else w[2] = 28;
if(check()) ans++; // 如果日期符合要求,计数器加一
d++; // 天数加一
if(d>w[m]) { // 如果天数超过了这个月的天数
m++; // 月份加一
d=1; // 天数重置为1
}
if(m>12) { // 如果月份超过了12
y++; // 年份加一
m=1; // 月份重置为1
}
}
System.out.println(ans); // 输出计数器的值
}
static boolean check() { // 判断日期是否符合要求
int sum=0; // 定义各位数字之和
int yy=y;
while(yy>0) { // 计算年份各位数字之和
sum+=yy%10;
yy/=10;
}
int mm=m;
while(mm>0) { // 计算月份各位数字之和
sum+=mm%10;
mm/=10;
}
int dd=d;
while(dd>0) { // 计算日期各位数字之和
sum+=dd%10;
dd/=10;
}
int temp=(int)Math.sqrt(sum); // 计算各位数字之和的平方根
return temp*temp==sum; // 判断各位数字之和的平方根的平方是否等于各位数字之和
}
}
8.星期几
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
1949 年的国庆节( 10 月 11 日)是星期六。
今年(2012)的国庆节是星期一。
那么,从建国到现在,有几次国庆节正好是星期日呢?
不要求写出具体是哪些年,只要一个数目!
运行限制
- 最大运行时间:1s
- 最大运行内存: 128M
与第六题,第七题 几乎一样,只需根据题意改变check方法中的代码即可
public class Main {
static int[] w= {0,31,28,31,30,31,30,31,31,30,31,30,31}; // w数组存储每个月的天数
static int y=1949,m=10,d=1,x=6; // y年,m月,d日,x星期几(1-7)
public static void main(String[] args) {
int ans=0; // 记录符合条件的日期数
while(y!=2012||m!=12||d!=31) { // 循环直到日期为2012年12月31日
if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) w[2] = 29; // 判断是否为闰年
else w[2] = 28;
if(check()) ans++; // 如果符合条件,ans加1
d++; // 日期加1
if(x>=7) {
x=1; // 如果星期几为7,重置为1
}
else x++; // 否则星期几加1
if(d>w[m]) { // 如果日期大于该月天数
m++; // 月份加1
d=1; // 日期重置为1
}
if(m>12) { // 如果月份大于12
y++; // 年份加1
m=1; // 月份重置为1
}
}
System.out.println(ans); // 输出符合条件的日期数
}
static boolean check() { // 判断是否为特定日期
return m==10&&d==1&&x==7; // 如果是返回true,否则返回false
}
}
9.图书推荐
Git是一款让人一开始觉得很容易学,但却很难精通的工具。本书除了介绍Git的相关知识外,还会模拟各种常见的状况,让读者知道应该在什么时候使用什么指令。
《Git从入门到精通》共分11个章节,1~3章介绍安装工具及环境,对于已经安装完成的读者可直接从第4章开始阅读。第5章介绍Git基本的使用方式,虽然难度不高,但却是整个Git系统的基础。第6章介绍Git中常用的分支功能以及使用情境,第7~9章则是介绍如何修改现有的历史记录、使用标签,以及如何应对其他常见的状况。
前面的内容都是在自己的计算机上就可以完成的,从第10章开始介绍如何将自己计算机里的记录推一份到线上(GitHub)。*后一章(第11章)介绍团队开发时可能会使用的开发过程Git Flow。
市面上的参考书籍或网络教程大多是教大家如何通过终端机指令来学习Git,这让不少想学习Git的新手打了退堂鼓。本书除了教大家如何在终端机视窗中输入Git指令,还搭配了图形界面工具,缓和了读者的学习曲线,让读者更容易上手。
本次送书 2 本 评论区抽2位小伙伴送书
活动时间:截止到 2023-04-08 15:00:00抽奖方式:利用程序进行抽奖。
参与方式:关注博主、点赞、收藏,评论区评论 "人生苦短,一起加油!"
迫不及待的小伙伴也可以访问下面的链接进行自主购买哦
京东自营购买链接:
🍓 获奖名单🍓
名单公布时间: 2023-04-08 15:00:00
更多推荐
所有评论(0)