快速掌握CMake「二、编写CMakeLists文件」
「CMake」是一个跨平台的C++项目管理解决方案,它可以帮助用户方便地管理大型C++项目,支持生成不同平台的Makefile。本系列文章可以帮助你快速掌握CMake,所有内容来源于Mastering Cmake。
本篇文章为该系列的第二篇,我们将讨论如何为你的项目编写一个基本的CMakeLists文件,包括基本的命令和你在项目中可能会遇到的问题。本文还将讨论CMakeLists文件的健壮性和可维护性。
2.1 编辑CMakeLists文件
你可以使用大多数的文本编辑器来编辑CMakeLists文件,比如Notepad++,VS Code等等。它们自带了CMake语法高亮显示和缩进支持。而其他的一些编辑器比如Emacs或者Vim,CMake包含缩进和语法高亮模块,你可以在源码的Auxiliary目录中找到它们,或者从CMake的下载页面下载。
在任何支持的生成器(Makefiles, Visual Studio等)中,如果你编辑了一个CMakeLists文件并使用CMake重新构建,生成器会根据需要自动调用CMake来更新生成的文件(例如Makefiles或项目文件)。这有助于确保生 ...
快速掌握CMake「一、起步」
「CMake」是一个跨平台的C++项目管理解决方案,它可以帮助用户方便地管理大型C++项目,支持生成不同平台的Makefile。本系列文章可以帮助你快速掌握CMake,所有内容来源于Mastering Cmake。
本篇文章为该系列的第一篇。
1.1 安装Cmake
在使用CMake之前,当然你需要在你的操作系统上安装它。在很多操作系统的包管理软件中你基本都能找到CMake的发行版,比如Cygwin,Debian,FreeBSD,Mac的MacPort、HomeBrew等。
如果你的操作系统没有对应的CMake版本,你可以到CMake的下载页面去下载与你的计算机架构相符的Cmake预编译版本。或者你也可以下载CMake的源码自行编译安装,只需要参考源码根目录的Readme.txt文件并按照提示进行编译即可。
1.2 目录结构
CMake在构建一个项目时有两个主要的目录:源码目录和二进制目录。源码目录下存放的是项目的源代码和CMakeLists文件,二进制目录通常命名为build,CMake会将对象文件,库,可执行文件存放其中。CMake不会更改除了build目录以外的任何文件。
源代 ...
LLDB快速入门
最近准备重拾C++,整理一下LLDB的快速入门Tutorial,内容来源LLDB官网。
1. 命令结构
不同于gdb的自由形式的命令,lldb的命令都是高度结构化的。所有的lldb命令都具有以下形式:
<noun> <verb> [-options [option-value]] [argument [argument...]]<名词> <动词> [-选项 [选项值]] [参数 [参数...]]
命令行解析是在命令执行之前完成的,因此所有命令的形式都是统一的。基本命令的命令语法是非常简单的,所有的参数,选项和选项值都用空格隔开,如果你的参数中包含空格,那么请用双引号将参数括起来。如果你的参数中有双引号或者反斜杠,那么请在它们之前加一个反斜杠来转义。
你可以在一条命令的任何地方加入一个选项,但如果参数以“-”开头,那么你需要添加一个选项终止符“--”(option termination),来告诉lldb所有的选项已经指定完毕了。比如,你想启动一个线程,并且给process launch命令指定一个-stop-at-entry选项,同时你 ...
LeetCode 48. 旋转图像
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
示例 1:
img
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[[7,4,1],[8,5,2],[9,6,3]]
示例 2:
img
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
提示:
n == matrix.length == matrix[i].length
1 <= n <= 20
-1000 <= matrix[i][j] <= 1000
思路
我们首先按照标准的坐标系列出上述的例子,向右为轴正向,向上为轴正向。可见,题目的要求是将矩阵沿中心逆时针旋转。
[7,8,9] [9,6,3][4,5,6] ==> [8,5,2][1 ...
LeetCode 516. 最长回文子序列
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入:s = "bbbab"输出:4解释:一个可能的最长回文子序列为 "bbbb" 。
示例 2:
输入:s = "cbbd"输出:2解释:一个可能的最长回文子序列为 "bb" 。
提示:
1 <= s.length <= 1000
s 仅由小写英文字母组成
思路
本题与LeetCode 5. 最长回文子串的思路大体相同。
状态转移方程为 与最长回文子串的状态转移方程大同小异。我们只需根据子串的长度迭代即可。
class Solution { public int longestPalindromeSubseq(String s) { // dp[i][j] 表示i和j之间最长的子序列 int len = s.length(), max = 1; int[][] dp = new int[len][len]; for (int i = ...
LeetCode 221. 最大正方形
在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。
示例 1:
img
输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]输出:4
示例 2:
img
输入:matrix = [["0","1"],["1","0"]]输出:1
示例 3:
输入:matrix = [["0"]]输出:0
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 300
matrix[i][j] 为 '0' 或 '1'
思路
本题也是动态规划的题,重点在于找到转台转移方程。
设表示第行第列包含的最大正方形边长,稍加观察即发现其满足下列方程: 我们只需设置好边界条件,然后填充dp数组即可。
class Solution { public int maximalSquare(char[][] matrix) { ...
LeetCode 40. 组合总和 II
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,输出:[[1,1,6],[1,2,5],[1,7],[2,6]]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,输出:[[1,2,2],[5]]
提示:
1 <= candidates.length <= 100
1 <= candidates[i] <= 50
1 <= target <= 30
思路
本题的思路与组合总数大抵一致,但由于本题存在重复元素,所以要先进行排序,然后剪枝,否则会超时。
如果当前搜索的序列中的前缀存在重复元素,只需将前缀中的重复元素去除即可。
如序列1,1,1,2,3的搜索结果中一定包含了1,1,2,3的搜索结果。
cla ...
LeetCode 39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
示例 1:
输入:candidates = [2,3,6,7], target = 7输出:[[2,2,3],[7]]解释:2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。7 也是一个候选, 7 = 7 。仅有这两种组合。
示例 2:
输入: candidates = [2,3,5], target = 8输出: [[2,2,2,2],[2,3,3],[3,5]]
示例 3:
输入: candidates = [2], target = 1输出: []
提示:
1 <= candidates.length <= 30
1 ...
LeetCode 189. 轮转数组
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]
示例 2:
输入:nums = [-1,-100,3,99], k = 2输出:[3,99,-1,-100]解释: 向右轮转 1 步: [99,-1,-100,3]向右轮转 2 步: [3,99,-1,-100]
提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
进阶:
尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
思路
问题的难度在于仅借助复杂度的空间,使得数组向前移动位。蛮力算法需要花费时间,我们考虑迭代版本。
假设从开始 ...
LeetCode 46. 全排列
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
输入:nums = [0,1]输出:[[0,1],[1,0]]
示例 3:
输入:nums = [1]输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
思路
直接爆搜。
class Solution { int[] nums; boolean[] visit; int len; List<List<Integer>> ans; public List<List<Integer>> permute(int[] nums) { ans = new ArrayList<>(); this.nu ...