电话号码的字母组合
电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 1:
12输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]
示例 2:
12输入:digits = ""输出:[]
示例 3:
12输入:digits = "2"输出:["a","b","c"]
提示:
0 <= digits.length <= 4
digits[i] 是范围 ['2', '9'] 的一个数字。
从选哪个的视角来看
1234567891011121 ...
子集
子集给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的
子集
(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
12输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
12输入:nums = [0]输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
从nums[i]选还是不选这个角度分析。每一个数都有两种情况,选或不选,所以要把这两种情况都考虑进去。
12345678910111213141516171819202122232425class Solution { // nums[i]选或不选 List<List<Integer>> res = new ArrayList<>(); List<Integer> list = new ...
全排列
全排列给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
示例 1:
12输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
示例 2:
12输入:nums = [0,1]输出:[[0,1],[1,0]]
示例 3:
12输入:nums = [1]输出:[[1]]
提示:
1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整数 互不相同
从答案的视角看这道题,- - - 答案有三个槽位,在这三个槽位上填上三个不同的数。
固定一个槽位,深搜下一个槽位,回来之后再换一个数固定继续深搜,由于三个数不能相同,所以需要一个数组判断该数是否被使用过。
123456789101112131415161718192021222324252627class Solution { List<List<Integer>> res = new Ar ...
计网操作系统
计网操作系统计网计网基础知识1.解释一下IP地址、子网掩码、网络地址。IP 地址IP地址是用来唯一标识互联网上每台设备的数字地址。IPv4地址是一个32位的二进制数,通常表示为四个十进制数(每个数在0到255之间),中间用点号分隔开,如192.168.1.1。而IPv6地址则是一个128位的二进制数,通常表示为八组四位十六进制数,中间用冒号分隔,例如2001:0db8:85a3:0000:0000:8a2e:0370:7334。
子网掩码子网掩码用于确定IP地址中的哪部分代表网络地址,哪部分代表主机地址。通过与IP地址进行按位与运算,子网掩码可以帮助计算出设备所属的具体子网。对于IPv4,子网掩码也是一个32位的二进制数,通常以点分十进制形式表示,例如255.255.255.0。不同的子网掩码可以创建不同大小的子网。
网络地址IP地址和子网掩码进行按位与(bitwise AND)运算可以得到网络地址,也就是该IP地址所在的网络部分。
2.如何在Linux上配置一个IP地址,如果给定端口号如何解析出域名?
配置Linux系统的IP地址的方法,主要有以下三种: -ifconfig ifco ...
设计模式
设计模式1.单一职责原则单一职责原则:一个类或者模块只负责完成一个职责(或者功能)
一个类只负责完成一个职责或者功能。也就是说,不要设计大而全的类,要设计粒度小、功能单一的类。换个角度来讲就是,一个类包含了两个或者两个以上业务不相干的功能,那我们就说它职责不够单一,应该将它拆分成多个功能更加单一、粒度更细的类。
评价一个类的职责是否足够单一,我们并没有一个非常明确的、可以量化的标准,可以说,这是件非常主观、仁者见仁智者见智的事情。实际上,在真正的软件开发中,我们也没必要过于未雨绸缪,过度设计。所以, 我们可以先写一个粗粒度的类,满足业务需求。随着业务的发展,如果粗粒度的类越来越庞大,代码越来越多,这个时候,我们就可以将这个粗粒度的类,拆分成几个更细粒度的类。这就是所谓的持续重构(后面的章节中我们会讲到)。
2.开闭原则“对扩展开放、对修改关闭”。添加一个新的功能应该是,在已有代码基础上扩展代码(新增模块、类、方法等),而非修改已有代码(修改模块、类、方法等)。
怎么实现“对扩展开放、对修改关闭”?
在写代码的时候后,我们要多花点时间往前多思考一下,这段代码未来可能有哪些需求变更、如何设 ...
分布式
分布式1.分布式理论1.CAP 理论1.什么时候CAP?CAP 也就是 Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性) 这三个单词首字母组合。
在理论计算机科学中,CAP 定理(CAP theorem)指出对于一个分布式系统来说,当设计读写操作时,只能同时满足以下三点中的两个:
一致性(Consistency)是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。
可用性(Availability) 是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。
分区容错性(Partition tolerance) 是指分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。
2.为什么分布式系统中无法同时保证一致性和可用性?首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取 ...
JVM
JVM1.new一个对象到销毁的过程/java对象创建过程?在Java中,从创建(new)一个对象到销毁的过程大致可以分为以下几个步骤:
检查类是否加载:对象的实际创建是通过new关键字实现的。当JVM遇到new关键字时,会检查类是否已经加载到运行时数据区的方法区,如果没有,则先进行类的加载和初始化。
分配内存空间:当使用new关键字创建一个对象时,JVM会在运行时数据区的堆中为该对象分配相应的内存空间。
初始化对象:JVM会调用相应的构造方法来初始化对象,给对象的成员变量赋予初始值。
使用对象:在程序运行过程中,可以通过对象引用来访问和操作对象的成员变量和方法。
对象不再被引用:当对象不再被任何变量或数据结构引用时,它就成为垃圾对象,等待垃圾回收器进行回收。
垃圾回收:JVM的垃圾回收器会定期检查堆内存中的垃圾对象,并自动回收它们所占用的内存空间。垃圾回收的具体时机和策略取决于JVM的垃圾回收算法。
内存空间释放:当垃圾对象被回收后,它们占用的内存空间会被释放,以便重新分配给新创建的对象。
需要注意的是,JVM的垃圾回收机制会自动处理对象的销毁和内存空间的释放,程序员无 ...
实现Trie(前缀树)
实现Trie(前缀树)**Trie**(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补全和拼写检查。
请你实现 Trie 类:
Trie() 初始化前缀树对象。
void insert(String word) 向前缀树中插入字符串 word 。
boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。
boolean startsWith(String prefix) 如果之前已经插入的字符串 word 的前缀之一为 prefix ,返回 true ;否则,返回 false 。
示例:
1234567891011121314输入["Trie", "insert", "search", "search", "startsWith", "insert", "sea ...
课程表
课程表你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。
在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。
例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。
请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。
示例 1:
123输入:numCourses = 2, prerequisites = [[1,0]]输出:true解释:总共有 2 门课程。学习课程 1 之前,你需要完成课程 0 。这是可能的。
示例 2:
123输入:numCourses = 2, prerequisites = [[1,0],[0,1]]输出:false解释:总共有 2 门课程。学习课程 1 之前,你需要先完成课程 0 ;并且学习课程 0 之前,你还应先完成课程 1 。这是不可能的。
提示:
1 <= numCour ...
腐烂的橘子
腐烂的橘子在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:
值 0 代表空单元格;
值 1 代表新鲜橘子;
值 2 代表腐烂的橘子。
每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。
返回 直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1 。
示例 1:
12输入:grid = [[2,1,1],[1,1,0],[0,1,1]]输出:4
示例 2:
123输入:grid = [[2,1,1],[0,1,1],[1,0,1]]输出:-1解释:左下角的橘子(第 2 行, 第 0 列)永远不会腐烂,因为腐烂只会发生在 4 个方向上。
示例 3:
123输入:grid = [[0,2]]输出:0解释:因为 0 分钟时已经没有新鲜橘子了,所以答案就是 0 。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 10
grid[i][j] 仅为 0、1 或 2
橘子的腐烂过程是一个按层扩散的过程,所以可以用BFS解决。
初始化:
遍历整个网格 ...