940. 不同的子序列 II
# 940. 不同的子序列 II
给定一个字符串 s,计算 s 的 不同非空子序列 的个数。因为结果可能很大,所以返回答案需要对 $10^9 + 7$ 取余 。
字符串的 子序列 是经由原字符串删除一些(也可能不删除)字符但不改变剩余字符相对位置的一个新字符串。
例如,“ace” 是 “abcde” 的一个子序列,但 “aec” 不是。
示例 1:
输入:s = "abc"输出:7解释:7 个不同的子序列分别是 "a", "b", "c", "ab", "ac", "bc", 以及 "abc"。
示例 2:
输入:s = "aba"输出:6解释:6 个不同的子序列分别是 "a", "b", "ab", "ba", "aa" 以及 "aba"。
示例 3:
输入:s = "aaa ...
C++学习笔记(一)
本系列呢,目前是我个人学习 C++ Primer 这本书的学习纪录,整本书 19 章,顺利的话这个系列大概会持续 1 个月左右,尽量每天一章那个样子吧,可能记的没什么逻辑格式等等等等,毕竟,只是个笔记,太注重格式感觉本末倒置了,尽量持续更新吧,希望不鸽。
# 1. 函数
函数的定义包含四部分:返回类型(return type)、函数名(function name)、一个括号包围的形参列表(parameter list,允许为空)以及函数体(function body)。
main 函数是比较特殊的,操作系统需要通过调用 main 来运行 C++ 程序,但它在定义上与其他函数是一样的。
main 函数的返回类型必须为 int,即整数类型。int 类型是一种内置类型(built-in type),即语言自身定义的类型。
函数定义的最后一部分是函数体,它是一个以左花括号(curly brace)开始,以右花括号结束的语句块(block of statements)
# 2. 类型
类型是程序设计最基本的概念之一,在本书中我们会反复遇到它。一种类型不仅定义了数据元素的内容,还定义了这类数据 ...
769. 最多能完成排序的块
# 769. 最多能完成排序的块
给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。
我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。
返回数组能分成的最多块数量。
示例 1:
输入: arr = [4,3,2,1,0]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2],这不是有序的数组。
示例 2:
输入: arr = [1,0,2,3,4]输出: 4解释:我们可以把它分成两块,例如 [1, 0], [2, 3, 4]。然而,分成 [1, 0], [2], [3], [4] 可以得到最多的块数。
提示:
n == arr.length
1 <= n <= 10
0 <= arr[i] < n
arr 中每个元素都 不同
# 题解
其实只要理解题意,这道题很简单,无非就是要我们依次找出数组前缀排序后与原数组排序后相同;又因为数组中的数为 [ ...
类型转换运算符
C++ 有四个用于类型转换的运算符,它们被称为类型转换运算符。
static_cast:静态类型转换
dynamic_cast:动态转换
const_cast:常量转换
reinterpret_cast:重新释义转换
static_cast
static_cast 运算符执行非动态转换,没有运行时类检查来保证转换的安全性。例如,它可以用来把一个基类指针转换为派生类指针。
使用方式:static_cast (expr)
dynamic_cast
dynamic_cast 在运行时执行转换,验证转换的有效性。如果转换未执行,则转换失败,表达式 expr 被判定为 null。dynamic_cast 执行动态转换时,type 必须是类的指针、类的引用或者 void*,如果 type 是类指针类型,那么 expr 也必须是一个指针,如果 type 是一个引用,那么 expr 也必须是一个引用。
使用方式:dynamic_cast (expr)
const_cast
const_cast 运算符用于修改类型的 const /volatile 属性。除了 const 或 volatile 属 ...
单例模式
本文整理自网络,后续将不断充实,也许等我变牛了能写出更好的吧,推荐这篇文章,感觉很牛。
# 单例模式
设计模式之一
这种设计模式属于创建型模式,它提供了一种创建对象的最佳方式
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方法,可以直接访问,不需要实例化该类的对象。
# 注意:
单例类只能有一个实例。
单例类必须自己创建自己的唯一实例。
单例类必须给所有其他对象提供这一实例。
# 实现方式
# 1. 懒汉模式,线程不安全
懒汉模式 (Lazy-Initialization) 直到使用时才会实例化对象,即调用 Instance () 方法时才会 new 一个单例的对象,如果不被调用就不会占用内存。这种模式单线程没有问题,但多线程时就会出现不可靠的情况。(以时间换空间)
#include <iostream>using namespace std;class Singleton {public: static Singleton *getInstance() { i ...
817. 链表组件
# 817. 链表组件
给定链表头结点 head ,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums ,该列表是上述链表中整型值的一个子集。
返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段最长连续结点的值(该值必须在列表 nums 中)构成的集合。
示例 1:
输入: head = [0,1,2,3], nums = [0,1,3]
输出: 2
解释:链表中,0 和 1 是相连接的,且 nums 中不包含 2,所以 [0, 1] 是 nums 的一个组件,同理 [3] 也是一个组件,故返回 2。
示例 2:
输入: head = [0,1,2,3,4], nums = [0,3,1,4]
输出: 2
解释:链表中,0 和 1 是相连接的,3 和 4 是相连接的,所以 [0, 1] 和 [3, 4] 是两个组件,故返回 2。
提示:
链表中节点数为 n
1 <= n <= 104
0 <= Node.val < n
Node.val 中所有值 不同
1 <= nums.length <= ...
1790. 仅执行一次字符串交换能否使两个字符串相等
# 1790. 仅执行一次字符串交换能否使两个字符串相等
给你长度相等的两个字符串 s1 和 s2 。一次 字符串交换 操作的步骤如下:选出某个字符串中的两个下标(不必不同),并交换这两个下标所对应的字符。
如果对 其中一个字符串 执行 最多一次字符串交换 就可以使两个字符串相等,返回 true ;否则,返回 false 。
示例 1:
输入:s1 = "bank", s2 = "kanb"输出:true解释:例如,交换 s2 中的第一个和最后一个字符可以得到 "bank"
示例 2:
输入:s1 = "attack", s2 = "defend"输出:false解释:一次字符串交换无法使两个字符串相等
示例 3:
输入:s1 = "kelb", s2 = "kelb"输出:true解释:两个字符串已经相等,所以不需要进行字符串交换
示例 4:
输入:s1 = "abcd", s2 = "dcba&qu ...
docker使用手册
# CentOS Docker 安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
设置仓库
$ sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装 Docker EC
// 最新版本$ sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin// 特定版本$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
安装 Ubuntu
$ docker pull ubuntu:[version]
# docker 基础命令
启动 docker
systemctl start docker
关闭 ...
801. 使序列递增的最小交换次数
# 801. 使序列递增的最小交换次数
我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中,我们可以交换 nums1 [i] 和 nums2 [i] 的元素。
例如,如果 nums1 = [1,2,3,8] , nums2 =[5,6,7,4] ,你可以交换 i = 3 处的元素,得到 nums1 =[1,2,3,4] 和 nums2 =[5,6,7,8] 。
返回 使 nums1 和 nums2 严格递增 所需操作的最小次数 。
数组 arr 严格递增 且 arr [0] < arr [1] < arr [2] < … < arr [arr.length - 1] 。
注意:
用例保证可以实现操作。
示例 1:
输入: nums1 = [1,3,5,4], nums2 = [1,2,3,7]输出: 1解释: 交换 A[3] 和 B[3] 后,两个数组如下:A = [1, 3, 5, 7] , B = [1, 2, 3, 4]两个数组均为严格递增的。
示例 2:
输入: nums1 = [0,3,5,8,9], nums2 ...
856. 括号的分数
# 856. 括号的分数
给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:
() 得 1 分。
AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。
(A) 得 2 * A 分,其中 A 是平衡括号字符串。
示例 1:
输入: "()"输出: 1
示例 2:
输入: "(())"输出: 2
示例 3:
输入: "()()"输出: 2
示例 4:
输入: "(()(()))"输出: 6
提示:
S 是平衡括号字符串,且只含有 ( 和 ) 。
2 <= S.length <= 50
# 题解
根据题意,我们可以求每组 "()“对应的深度 d,那么 $2^d$ 就是这组”()" 所贡献的分数。
class Solution {public: int scoreOfParentheses(string s) { int ans=0,flag=0; for(int i=0;i<s ...