2024年Java最全蓝桥杯AcWing学习笔记 1-2递推的学习(Java)(1),46岁程序员被互联网公司辞退

总目录展示

该笔记共八个节点(由浅入深),分为三大模块。

高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。该笔记将从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这4个方面重点介绍。

一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,将用一个节点来专门讲解如何设计秒杀减库存方案。

高可用。 虽然介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,还要设计一个PlanB来兜底,以便在最坏情况发生时仍然能够从容应对。笔记的最后,将带你思考可以从哪些环节来设计兜底方案。


篇幅有限,无法一个模块一个模块详细的展示(这些要点都收集在了这份《高并发秒杀顶级教程》里),麻烦各位转发一下(可以帮助更多的人看到哟!)

由于内容太多,这里只截取部分的内容。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

}

}


AcWing 95. 费解的开关

将所有灯变亮 也就是所有数字变为1

我们以输入的第二个5x5的数为例:

11101

11101

11110

11111

11111

怎么把所有灯变亮呢?

我们可以先灭掉(2,5),然后再涂右上角的就可以,两步完成,所以输出2。

灭掉(2,5),(2,4)(3,5)亮,(1,5)灭

1

此时的5x5数字为

11100

11110

11111

11111

11111

再将(1,5)也就是右上角点亮,(1,4)(2,5)亮,所有数字全亮。

2

此时数字为

11111

11111

11111

11111

11111

符合题目要求,两步完成,输出2。

思想:

每一行开关的操作完全被上一行灯的亮灭状态所唯一确定

我们只需要枚举第一行的操作,之后所有的操作都可以根据上一行的亮灭来进行操作; 第二行的操作完全取决于第一行,第一行操作完改变了第一行的状态,第一行的状态决定了第二行的操作,假如第一行操作完之后还有灭的,因为第一行不能操作了,所以我们只能按第二行来使第一行的灯全亮,同理,第三行的操作完全取决于第二行,以此类推。

顺序可以任意,每个格子最多按一次。

所以解法就是枚举第一行,之后的所有操作就都确定了。

最后一行的状态不能改了,需要特判一下,如果有灭着的说明方案不合法,如果全亮说明方案ok。

import java.util.Scanner;

public class Main {

static final int N = 6;

static char[][] g = new char[N][N];

static char[][] backup = new char[N][N]; // 备份数组

static int[] dx = {-1, 0, 1, 0, 0}; // 坐标x的偏移量

static int[] dy = {0, 1, 0, -1, 0}; // 坐标y的偏移量

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

int n = sc.nextInt();

while (n-- != 0) {

for (int i = 0; i < 5; i++) g[i] = sc.next().toCharArray();

int res = Integer.MAX_VALUE;

for (int op = 0; op < 32; op++) { // 5位数 转换成2进制最大的数是32

for (int i = 0; i < 5; i++) {

backup[i] = g[i].clone();

}

int step = 0;

// 对第一行状态的判断

for (int i = 0; i < 5; i++) {

if ((op >> i & 1) == 0) { // 判断i的二进制的第几位是不是1

step++;

turn(0, 4 - i);

}

}

// 对2,3,4行判断

for (int i = 0; i < 4; i++){

for (int j = 0; j < 5; j++){

if (g[i][j] == ‘0’) {

step++;

turn(i + 1, j);

}

}

}

boolean dark = false;

// 对最后一行特判

for (int i = 0; i < 5; i++) {

if (g[4][i] == ‘0’) {

dark = true;

break;

}

}

if (!dark) res = Math.min(res, step);

for (int i = 0; i < 5; i++) {

g[i] = backup[i].clone();

}

}

if (res > 6) res = -1;

System.out.println(res);

}

}

// 利用偏移量改变5个位置的值

private static void turn(int x, int y) {

for (int i = 0; i < 5; i++) {

int a = x + dx[i];

int b = y + dy[i];

if (a < 0 || a >= 5 || b < 0 || b >= 5) continue; // 在边界外,直接忽略即可

g[a][b] ^= 1; // 异或运算

}

}

}


AcWing 116. 飞行员兄弟

-±-



-±-

目的:将所有+号变成-

假设切换一下图中圈红的位置,这个绿色的部分就会变成下图所示,它所处的行和列都会变化。

image-20220110162112059

我们发现这个题是很难递推出来的,它跟上一题开关问题不一样,上一题是每一次只会有一个开关能影响灯泡,但是这题是每一个开关可以被很多个开关控制,这一个开关的状态并不会影响到其余开关的操作,因此我们不能用递推的方法来解决这道题。

本题是为了区分上一题,不要固定思想!!这道题没法用递推来解决咱们就直接暴力搜索所有方案。

思想:

枚举所有方案 0~2^16 - 1

按照该方案对所有开关进行操作

判断 => 记录方案

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

public class Main {

static final int N = 5;

static char[][] g = new char[N][N];

static char[][] backup = new char[N][N]; // 备份数组

static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

public static void main(String[] args) throws Exception {

for (int i = 0; i < 4; i++) g[i] = in.readLine().toCharArray();

List res = new ArrayList<>();

for (int op = 0; op < 1 << 16; op++) { // 1 << 16 同等于2^16

List temp = new ArrayList<>();

for (int i = 0; i < 4; i++) {

backup[i] = g[i].clone(); // 备份

}

// 进行操作

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 4; j++) {

if ((op >> get(i, j) & 1) == 1) {

temp.add(new PII(i, j));

turn_all(i, j);

}

}

}

// 判断所有灯泡是否全亮

boolean has_closed = false;

for (int i = 0; i < 4; i++) {

for (int j = 0; j < 4; j++) {

if (g[i][j] == ‘+’) has_closed = true;

}

}

if (has_closed == false) {

if (res.isEmpty() || res.size() > temp.size()) res = temp;

}

for (int i = 0; i < 4; i++) {

g[i] = backup[i].clone(); // 还原

}

}

System.out.println(res.size());

for (PII p : res) System.out.println((p.x + 1) + " " + (p.y + 1));

in.close();

}

private static void turn_all(int x, int y) {

for (int i = 0; i < 4; i++) {

turn_one(x, i);

turn_one(i, y);

}

turn_one(x, y);

}

private static void turn_one(int x, int y) {

if (g[x][y] == ‘+’) g[x][y] = ‘-’;

else g[x][y] = ‘+’;

}

/*

返回矩阵中数的位数

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

*/

private static int get(int x, int y) {

return 4 * x + y;

}

static class PII {

int x;

int y;

public PII (int x, int y) {

this.x = x;

this.y = y;

}

}

}

我的面试宝典:一线互联网大厂Java核心面试题库

以下是我个人的一些做法,希望可以给各位提供一些帮助:

整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!

image

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

image

还有源码相关的阅读学习

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

[外链图片转存中…(img-EOhVxpCg-1714896882804)]

283页的Java进阶核心pdf文档

Java部分:Java基础,集合,并发,多线程,JVM,设计模式

数据结构算法:Java算法,数据结构

开源框架部分:Spring,MyBatis,MVC,netty,tomcat

分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等

微服务部分:SpringBoot,SpringCloud,Dubbo,Docker

[外链图片转存中…(img-w9vCMVqm-1714896882805)]

还有源码相关的阅读学习

[外链图片转存中…(img-lDy1fLcj-1714896882805)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 18
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值