当前位置: 首页 > news >正文

数组 - 八皇后 - 困难

*************

C++

topic: 面试题 08.12. 八皇后 - 力扣(LeetCode)

*************

Good morning, gays, Fridary angin and try the hard to celebrate.

Inspect the topic:

This topic I can understand it in a second.  And I do rethink a movie, which talks anout chess

This title imposes the same rectructions on queens as the rules for queens in chess. In chess, queens may move either stright and diagonally. And may by this code was applied in some chees games.

 

Back to the topic, try to find the topics I've done which is similar to t his topic. It seems like no one like this. 

Use matrix, I learned matrix from a teacher, Master Tang:

Greedy algorithm, I did yesterday, may work. Every step goes to the best way, and might have the happy ending in the end.

First, put the queen in matrix[1][1], then put the second  row, maxtrix[2][1] is forbidden cuz it is in the first column. Matrix[2][2] is forbidden cuz it in the diagonal. Put it in matrix[2][3]. Actally, make sure that  matrix[i][i] put nothing. 

From the first row,  put the queen in the first column.

To the second row, put the queen in the first column, check if it conflicts with previous queens. If not, add a row. If so, change a column.

Take an example, N = 13, The position-array has 13 elements, each ranges from 0 to 12. 

For each increatment, generate a new array of positions. Check if the condition is satisfied for each array of positions. If satisfied, save it.                                                                         

When the last queen find her place, the war end.

This is a really new algorithm called Backtracking Algorithm.A backtracking algorithm is an algorithm that tries different things until it finds the right answer. It avoids doing unnecessary work. Backtracking algorithms are used to solve many kinds of problems. The usage of backtracking algorithm follows:

void backtrack(路径参数, 选择列表参数) {// 检查是否满足结束条件if (满足结束条件) {// 处理解决方案return;}// 遍历选择列表for (auto i : 选择列表) {// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

Try to write the code:

need to find a right way to describe the chess board. matrix N × N doesnot work, the reason of it is that memory is everything for the computer, N × N use tooooooooooooo much storage. Never think about it. 

Every queen has different row, so it can be used in one-line matrix, for instace:

 it can be described as 4 multiply 4 

  1. 1 0 0 0
  2. 0 0 1 0
  3. 0 1 0 0 
  4. 0 0 0 1

also, a smarter way to describe is as follow:

array X = [1, 3, 2, 4], which means

  1. the 1st  queen laies at row 1 column 1,
  2. the 2nd queen laies at row 2 column 3,
  3. the 3rd queen laies at row 3 column  2,
  4. the 4th queen laies at row 4 column  4,

but how to tell the computer that the queens cannot stay in the diagonal? 

the same color's position is illegal. It can EZ tell that two queens on the same diagonal if and only if their row and column differences are equal. 
|row1 - row4| == |column4 - column1|

There's no need to double-check each row and column; only the diagonals. To check more efficiently, record which columns and diagonals have been used when placing the queens.

record this in three sets:

  1. Columns where queens have already been placed.
  2. Primary diagonal: row-column values on the same primary diagonal.
  3. Sub-diagonal: row + column values where identical values are on the same sub-diagonal.

 so make up the code to describe the 3 sets in backtrack structure:

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (满足结束条件) {// 处理解决方案return;}// 遍历选择列表for (auto i : 选择列表) {// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

move next, what is 满足结束条件? it is the row == n, the last queen finds her palace.

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 处理解决方案return;}// 遍历选择列表for (auto i : 选择列表) {// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

and what is 处理解决方案? That is return the result. But pay vital attention to the result like this:

make sure that the code return a string:

 

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (auto i : 选择列表) {// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

the next step is 遍历选择列表. This is the most diffcult step, including how to lay the queens. Make sure that every column has been visited.

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (int col = 0; col < n; col++) {// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

If there's already a queen in the column, main diagonal, or sub-diagonal where you're placing the queen, skip that spot.

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (int col = 0; col < n; col++) {if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}// 添加当前选项到路径路径.push_back(i);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

in this special code :

if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}

1ULL meas 1 unsigned long long,  << means move 1 step to the left.

diag_mask is an integer, for example:

if col == 2, in binary system is 10;  1ULL << 2 is 4, in binary system is 100

see, in binary system, int 1 moves one step left.

then put the queen

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (int col = 0; col < n; col++) {if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}// 在当前位置放置皇后queens.push_back(col);// 进行递归backtrack(路径, 更新的选择列表);// 回溯,移除当前选项路径.pop_back();}
}

and move to the next row:

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (int col = 0; col < n; col++) {if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}// 在当前位置放置皇后queens.push_back(col);// 递归到下一行backtrack_bit(n, row + 1, cols_mask | (1ULL << col),diag1_mask | (1ULL << d1), diag2_mask | (1ULL << d2),queens, result);// 回溯,移除当前选项路径.pop_back();}
}

and next

void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) 
{// 检查是否满足结束条件if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 遍历选择列表for (int col = 0; col < n; col++) {if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}// 在当前位置放置皇后queens.push_back(col);// 递归到下一行backtrack_bit(n, row + 1, cols_mask | (1ULL << col),diag1_mask | (1ULL << d1), diag2_mask | (1ULL << d2),queens, result);// 回溯,移除当前皇后queens.pop_back();}
}

dont forget to initialize at the very beginning:

class Solution {
public:// 主函数,接收一个整数n,表示棋盘的大小vector<vector<string>> solveNQueens(int n) {vector<vector<string>> result; // 用于存储所有可能的解vector<int> queens; // 用于存储当前放置皇后的列位置// 从第0行开始回溯backtrack_bit(n, 0, 0, 0, 0, queens, result);return result; // 返回所有可能的解}private:// 回溯函数,参数包括棋盘大小n,当前行row,以及三个掩码void backtrack_bit(int n, int row, unsigned long long cols_mask,unsigned long long diag1_mask, unsigned long long diag2_mask,vector<int>& queens, vector<vector<string>>& result) {// 如果到达最后一行,说明找到了一个解if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 尝试在当前行的每一列放置皇后for (int col = 0; col < n; col++) {int d1 = row - col + (n - 1); // 对角线1的索引int d2 = row + col; // 对角线2的索引// 检查当前位置是否安全if ((cols_mask & (1ULL << col)) ||(diag1_mask & (1ULL << d1)) ||(diag2_mask & (1ULL << d2))) {continue; // 如果不安全,跳过这一列}// 在当前位置放置皇后queens.push_back(col);// 递归到下一行backtrack_bit(n, row + 1, cols_mask | (1ULL << col),diag1_mask | (1ULL << d1), diag2_mask | (1ULL << d2),queens, result);// 回溯,移除当前皇后queens.pop_back();}}
};

and of course it works:

unsigned longlong can be replaced as unsigned long, to save the storge.

class Solution {
public:// 主函数,接收一个整数n,表示棋盘的大小vector<vector<string>> solveNQueens(int n) {vector<vector<string>> result; // 用于存储所有可能的解vector<int> queens; // 用于存储当前放置皇后的列位置// 从第0行开始回溯backtrack_bit(n, 0, 0, 0, 0, queens, result);return result; // 返回所有可能的解}private:// 回溯函数,参数包括棋盘大小n,当前行row,以及三个掩码void backtrack_bit(int n, int row, unsigned long cols_mask,unsigned long diag1_mask, unsigned long diag2_mask,vector<int>& queens, vector<vector<string>>& result) {// 如果到达最后一行,说明找到了一个解if (row == n) {// 生成棋盘的字符串表示vector<string> board;for (int i = 0; i < n; i++) {string row_str(n, '.'); // 初始化一行,全部为'.'row_str[queens[i]] = 'Q'; // 在皇后的位置放置'Q'board.push_back(row_str); // 将这一行添加到棋盘表示中}result.push_back(board); // 将整个棋盘添加到结果中return;}// 尝试在当前行的每一列放置皇后for (int col = 0; col < n; col++) {int d1 = row - col + (n - 1); // 对角线1的索引int d2 = row + col; // 对角线2的索引// 检查当前位置是否安全if ((cols_mask & (1UL << col)) ||(diag1_mask & (1UL << d1)) ||(diag2_mask & (1UL << d2))) {continue; // 如果不安全,跳过这一列}// 在当前位置放置皇后queens.push_back(col);// 递归到下一行backtrack_bit(n, row + 1, cols_mask | (1UL << col),diag1_mask | (1UL << d1), diag2_mask | (1UL << d2),queens, result);// 回溯,移除当前皇后queens.pop_back();}}
};

 and here is the magic:

 consume memory ranges from 11.96 to 12.15. 

reverse upgrading, sad.

anyway 

wish me have a good weekend.

相关文章:

数组 - 八皇后 - 困难

************* C topic: 面试题 08.12. 八皇后 - 力扣&#xff08;LeetCode&#xff09; ************* Good morning, gays, Fridary angin and try the hard to celebrate. Inspect the topic: This topic I can understand it in a second. And I do rethink a movie, …...

【分布式】Redis分布式缓存

一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中&#xff0c;多台服务器共同对外提供服务&#xff0c;为了提高系统的性能和可扩展性&#xff0c;通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...

Ubuntu——extrepo添加部分外部软件源

extrepo 是一个用于 Ubuntu 和其他基于 Debian 的系统的工具&#xff0c;它的主要作用是简化和管理外部软件源&#xff08;repositories&#xff09;的添加和更新。通过使用 extrepo&#xff0c;用户可以方便地添加、删除和管理第三方软件源&#xff0c;而不需要手动编辑源列表…...

评估大语言模型(LLM)在分子预测任务能够理解分子几何形状性能

摘要 论文地址&#xff1a;https://arxiv.org/pdf/2403.05075 近年来&#xff0c;机器学习模型在各个领域越来越受欢迎。学术界和工业界都投入了大量精力来提高机器学习的效率&#xff0c;以期实现人工通用智能&#xff08;AGI&#xff09;。其中&#xff0c;大规模语言模型&a…...

如何查看电脑刷新率

Windows 系统 通过显示设置查看&#xff1a; 右键点击桌面空白处&#xff0c;选择 “显示设置”。在打开的窗口中&#xff0c;找到 “高级显示设置”。点击 “显示适配器属性”。在弹出的窗口中&#xff0c;选择 “监视器” 选项卡&#xff0c;即可看到当前的屏幕刷新率。使用 …...

mysql集群MHA方式部署

1. 基本信息 部署机器角色部署路径192.168.242.71MySQL-Mater MHA-NodeMySQL: /alidata1/mysql-8.0.28192.168.242.72MySQL-Slave MHA-NodeMHA-Node: /alidata1/admin/tools/mha4mysql-node-0.58192.168.242.73MySQL-Slave MHA-Node192.168.242.74MHA-ManagerMHA-Manager: …...

第十七章 使用 MariaDB 数据库管理系统

1. 数据库管理系统 数据库是指按照某些特定结构来存储数据资料的数据仓库。在当今这个大数据技术迅速崛起的年代&#xff0c;互联网上每天都会生成海量的数据信息&#xff0c;数据库技术也从最初只能存储简单的表格数据的单一集中存储模式&#xff0c;发展到了现如今存储海量…...

rabbitmq 安装延时队列插件rabbitmq_delayer_message_exchange(linux centOS 7)

1.插件版本 插件地址&#xff1a;Community Plugins | RabbitMQ rabbitmq插件需要对应的版本&#xff0c;根据插件地址找到插件 rabbitmq_delayer_message_exchange 点击Releases 因为我rabbitmq客户端显示的版本是&#xff1a; 所以我选择插件版本是&#xff1a; 下载 .ez文…...

Unity性能优化---动态网格组合(一)

网格组合是将 Unity 中的多个对象组合为一个对象的技术。因此&#xff0c;在多物体的场景中&#xff0c;使用网格组合&#xff0c;会有效的减少小网格的数量&#xff0c;最终将得到一个包含许多小网格的大网格游戏对象&#xff0c;这将提高游戏或模拟器的性能。在Unity 的 “St…...

Appium:安装uiautomator2失败

目录 1、通过nmp安装uiautomator2&#xff1a;失败 2、通过 Appium 的平台直接安装驱动程序 3、通过pip 来安装 uiautomator2 1、通过nmp安装uiautomator2&#xff1a;失败 我先是通过npm安装的uiautomator2&#xff0c;也显示已经安装成功了&#xff1a; npm install -g …...

电子信息工程自动化 单片机彩灯控制

摘要 随着社会经济和科学技术的不断进步&#xff0c;人们在保持发展的同时&#xff0c;环境带给人类的影响已经不足以让我们忽视&#xff0c;所以城市的美化问题慢慢的进入了人们的眼帘&#xff0c;PLC的产生给带电子产品带来了巨大变革&#xff0c;彩灯的使用在城市的美化中变…...

word poi-tl 表格功能增强,实现表格功能垂直合并

目录 问题解决问题poi-tl介绍 功能实现引入依赖模版代码效果图 附加&#xff08;插件实现&#xff09;MergeColumnData 对象MergeGroupData 类ServerMergeTableData 数据信息ServerMergeTablePolicy 合并插件 问题 由于在开发功能需求中&#xff0c;word文档需要垂直合并表格&…...

LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型 Matlab代码注释清晰。 程序设计 完整程序和数据获取方式&#xff1a;私信博主回复LSTM-CNN-BP-RF-SVM五模型咖喱融合策略混合预测模型&#xff08;Matlab&#…...

《鸿蒙开发-答案之书》 怎么设置Json字段的别名

《鸿蒙开发-答案之书》 怎么设置Json字段的别名 Android设置别名用的是SerializedName(“msg”)&#xff0c;那鸿蒙用的是啥&#xff0c;有点懵不知道。 鸿蒙得引入第三方库&#xff1a;ohpm install class-transformer 然后用Expose({ name: ‘first-name’ }) 示例代码&…...

ftp服务器搭建-安装、配置及验证

ftp服务器搭建-安装、配置及验证 #安装 sudo apt-get install vsftpd #配置文件 cat > /etc/vsftpd.conf << "EOF" listenNO listen_ipv6YES anonymous_enableNO local_enableYES write_enableYES dirmessage_enableYES use_localtimeYES xferlog_enable…...

鸿蒙应用获取wifi连接的ip地址(官方文档获取的格式转换成192.168.1.xxx格式)

目录 一.背景 二.官网流程 wifiManager.getLinkedInfo9+ 三.转换成192.168.xxx.xxx格式 一.背景 本次来学习如何获取到鸿蒙设备连接wifi后的ip地址,由于官网文档中获取的ip地址和我们平时看到的192:168:xxx:xxx有所不同,需要进行下转换,所以记录下,如下的流程是在OpenH…...

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…...

人工智能学习路线详细规划

一、引言 在当今科技飞速发展的时代&#xff0c;人工智能已成为引领未来的关键技术之一。无论是为了追求职业发展的新机遇&#xff0c;还是出于对这一前沿领域的浓厚兴趣&#xff0c;深入学习人工智能都是一个极具价值的选择。本文将为大家精心规划一条人工智能学习路线&#…...

深度学习之视觉处理

CNN 视觉处理三大任务&#xff1a;分类、目标检测、图像分割上游&#xff1a;提取特征&#xff0c;CNN下游&#xff1a;分类、目标、分割等&#xff0c;具体的任务 概述 卷积神经网络是深度学习在计算机视觉领域的突破性成果。在计算机视觉领域, 往往我们输入的图像都很大&am…...

遇到问题:hive中的数据库和sparksql 操作的数据库不是同一个。

遇到的问题&#xff1a; 1、hive中的数据库和sparksql 操作的数据库不同步。 观察上面的数据库看是否同步 &#xff01;&#xff01;&#xff01; 2、查询服务器中MySQL中hive的数据库&#xff0c;发现创建的位置没有在hdfs上&#xff0c;而是在本地。 这个错误产生的原因是&…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

数据库——redis

一、Redis 介绍 1. 概述 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、高性能的内存键值数据库系统&#xff0c;具有以下核心特点&#xff1a; 内存存储架构&#xff1a;数据主要存储在内存中&#xff0c;提供微秒级的读写响应 多数据结构支持&…...