系列文章目录
文章目录
- 系列文章目录
- 前言
前言
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。
很多编程语言都有位运算符,Java语言也不例外。在Java语言中,提供了7种位运算符,分别是按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)、带符号右移(>>)和无符号右移(>>>)。
这些运算符当中,仅有~是单目运算符,其他运算符均为双目运算符。
在讲解这些运算符的使用之前,必须了解一个常识,那就是:位运算符是对long、int、short、byte和char这5种类型的数据进行运算的,我们不能对double、float和boolean进行位运算操作。
如果你要理解本文章的理论和逻辑,可以参考,有人写了我就不啰嗦了
全网首发:12306抢票算法大曝光?(十张图搞定)
https://segmentfault.com/a/1190000023534009
如果你对Redis位图不理解,可以参考
使用Bitmaps位图实现Redis签到
https://www.javacui.com/DB/703.html
其他知识内容可以参考
https://www.javacui.com/index.php?keyword=redis
如果你已经了解运算符和Redis位图,那么按照上面文章说法,逻辑其实很简单,就是把所有座位初始化为位图,当你购买车站A到车站B的票时,把中间车站的位图进行计算,如果最终计算有票,则为有票。
当然这边只是在技术上对于这个逻辑进行了实现,12306实际的逻辑的话,大家都懂的,天花板。
相关逻辑的解释,都在注释里面了,直接运行一下即可理解,上代码:
package com.example.springboot;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.BitFieldSubCommands;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.ArrayList;
import java.util.List;
/**
* 12306分段购票模拟
*/
@SpringBootTest
public class A12306 {
@Autowired
private RedisTemplate redisTemplate;
private final static int cz = 5; // 几个站点
private final static int zw = 5; // 几个坐位
@Test
public void test1() {
init();
// 购买 2 张 1-3的票,此时有票
int from = 1, to = 3;
for (int i = 0; i < 2; i++) {
qp(from, to);
}
from = 2;
to = 4;
// 购买 2 张 2-4的票,此时有票
for (int i = 0; i < 2; i++) {
qp(from, to);
}
from = 1;
to = 5;
// 购买 2 张 1-5的票,此时有 1 张票
for (int i = 0; i < 2; i++) {
qp(from, to);
}
from = 1;
to = 3;
// 购买 1 张 1-3的票,此时 无票
qp(from, to);
}
public void qp(int from, int to