【数学】2、排列、组合

2023-11-07

在这里插入图片描述

一、排列

排列的定义:从 n 个不同的元素中取出 m(1≤m≤n)个不同的元素,按照一定的顺序排成一列,这个过程就叫排列(Permutation)。
排列:包含顺序

  • 对于 n 个元素的全排列,所有可能的排列数量就是 nx(n-1)x(n-2)x…x2x1,也就是 n!;
  • 对于 n 个元素里取出 m(0<m≤n) 个元素的不重复排列数量是 nx(n-1)x(n-2)x…x(n - m + 1),也就是 n!/(n-m)!

组合:不含顺序

  • 对于 n 个元素里取出 m(0<m≤n) 个元素的组合数量 n!/(m! * (n-m)!)

公式推导

1.1 田忌赛马

田忌是齐国有名的将领,他常常和齐王赛马,可是总是败下阵来,心中非常不悦。孙膑想帮田忌一把。他把这些马分为上、中、下三等。他让田忌用自己的下等马来应战齐王的上等马,用上等马应战齐王的中等马,用中等马应战齐王的下等马。三场比赛结束后,田忌只输了第一场,赢了后面两场,最终赢得与齐王的整场比赛。

孙膑每次都从田忌的马匹中挑选出一匹,一共进行三次,排列出战的顺序。是不是感觉这个过程很熟悉?这其实就是数学中的排列过程。

这其实是一个树状结构。从树的根结点到叶子结点,每种路径都是一种排列。有多少个叶子结点就有多少种全排列。从图中我们可以看出,最终叶子结点的数量是 3x2x1=6,所以最终排列的数量为 6。如下图:

{上等,中等,下等}
{上等,下等,中等}
{中等,上等,下等}
{中等,下等,上等}
{下等,上等,中等}
{下等,中等,上等}

代码实现如下:

public class Main {
	// 用 t1,t2 和 t3 分别表示田忌的上、中、下等马跑完全程所需的时间,用 q1,q2 和 q3 分别表示齐王的上、中、下等马跑全程所需的时间,因此,q1<t1<q2<t2<q3<t3。
	// 如果你将这些可能的排列,仔细地和齐王的上等、中等和下等马进行对比,只有{下等,上等,中等}这一种可能战胜齐王,也就是 t3>q1,t1<q2,t2<q3。
	// 孙膑的方法之所以奏效,是因为他看到每一等马中,田忌的马只比齐王的差一点点。如果相差太多,可能就会有不同的胜负结局。所以,在设置马匹跑完全程的时间上,我特意设置为 q1<t1<q2<t2<q3<t3,只有这样才能保证计算机得出和孙膑相同的结论
    public static HashMap<String, Double> q_horses_time = new HashMap<String, Double>() {
        {put("q1", 1.0); put("q2", 2.0); put("q3", 3.0);} // 设置齐王的马跑完所需时间
    };
    public static HashMap<String, Double> t_horses_time = new HashMap<String, Double>() {
        {put("t1", 1.5); put("t2", 2.5); put("t3", 3.5);} // 设置田忌的马跑完所需时间
    };
    public static ArrayList<String> q_horses = new ArrayList<String>(Arrays.asList("q1", "q2", "q3"));

    /**
     * @param horses- 目前还剩多少马没有出战,result- 保存当前已经出战的马匹及顺序
     * @return void
     * @Description: 使用函数的递归(嵌套)调用,找出所有可能的马匹出战顺序
     */
    public static void permutate(ArrayList<String> horses, ArrayList<String> result) {
        if (horses.size() == 0) {// 所有马匹都已经出战,判断哪方获胜,输出结果
            compare(result, q_horses);
            return;
        }
        for (int i = 0; i < horses.size(); i++) {
            // 从剩下的未出战马匹中,选择一匹,加入结果
            ArrayList<String> new_result = (ArrayList<String>) (result.clone());
            new_result.add(horses.get(i));
            
            // 将已选择的马匹从未出战的列表中移出
            ArrayList<String> rest_horses = ((ArrayList<String>) horses.clone());
            rest_horses.remove(i);    
            
            permutate(rest_horses, new_result); // 递归调用,对于剩余的马匹继续生成排列
        }
    }

    public static void compare(ArrayList<String> t, ArrayList<String> q) {
        int t_won_cnt = 0;
        for (int i = 0; i < t.size(); i++) {
            System.out.println(t_horses_time.get(t.get(i)) + " " + q_horses_time.get(q.get(i)));
            if (t_horses_time.get(t.get(i)) < q_horses_time.get(q.get(i))) t_won_cnt++;
        }

        if (t_won_cnt > (t.size() / 2)) System.out.println(" 田忌获胜!");
        else System.out.println(" 齐王获胜!");
    }

    public static void main(String[] args) {
        ArrayList<String> horses = new ArrayList<String>(Arrays.asList("t1", "t2", "t3"));
        permutate(horses, new ArrayList<String>());
    }
}

从最终输出的结果看,6种排列中只有如下1种田忌会获胜:
[t3, t1, t2]
3.5 1.0
1.5 2.0
2.5 3.0
田忌获胜!

而如果齐王也是随机安排他的马匹出战顺序,代码实现如下:这个交叉对比的过程也是个排列的问题,田忌这边有 6 种顺序,而齐王也是 6 种顺序,所以一共的可能性是 6x6=36 种。

public static void main(String[] args) {
	ArrayList<String> t_horses = new ArrayList<String>(Arrays.asList("t1", "t2", "t3")); 
	permutate(t_horses, new ArrayList<String>(), t_results); // 为田忌生成他马匹的全排序
	
	ArrayList<String> q_horses = new ArrayList<String>(Arrays.asList("q1", "q2", "q3"));
	permutate(q_horses, new ArrayList<String>(), q_results); // 为齐王生成他马匹的全排序

	for (int i = 0; i < t_results.size(); i++) {
		for (int j = 0; j < q_results.size(); j++) {
			compare(t_results.get(i), q_results.get(j)); // 交叉对比,看哪方获胜
		}
	}
}
// 由于交叉对比时只需要选择 2 个元素,分别是田忌的出战顺序和齐王的出战顺序,所以这里使用 2 层循环的嵌套来实现。从最后的结果可以看出,田忌获胜的概率仍然是 1/6。

1.2 暴力破解密码

如果密码每位有 m 种选择,共 n 位,则这是一个排列问题,共 n m n^m nm 种密码的可能排列。如果你遍历并尝试所有的可能性,就能破解密码了。

不过,即使存在这种暴力法,你也不用担心自己的密码很容易被人破解。我们平时需要使用密码登录的网站或者移动端 App 程序,基本上都限定了一定时间内尝试密码的次数,例如 1 天之内只能尝试 5 次等等。这些次数一定远远小于密码排列的可能性。

这也是为什么有些网站或 App 需要你一定使用多种类型的字符来创建密码,比如字母加数字加特殊符号。因为类型越多, n m n^m nm 中的 n 越大,可能性就越多。

  • 如果使用英文字母的 4 位密码,就有 5 2 4 = 7311616 52^4=7311616 524=7311616 种(即每位密码有 52 种选择,也就是大小写字母加在一起的数量),超过了 700 万种。
  • 如果我们在密码中再加入 0~9 这 10 个阿拉伯数字,那么可能性就是 6 2 4 = 14776336 62^4=14776336 624=14776336 种,超过了 1400 万。

同理,我们也可以增加密码长度,也就是用 n m n^m nm 中的 m 来实现这一点。如果在英文和阿拉伯数字的基础上,我们把密码的长度增加到 6 位,那么就是 6 2 6 = 56800235584 62^6=56800235584 626=56800235584 种,已经超过了 568 亿了!这还没有考虑键盘上的各种特殊符号。有人估算了一下,如果用上全部 256 个 ASCII 码字符,设置长度为 8 的密码,那么一般的黑客需要 10 年左右的时间才能暴力破解这种密码。

如果每位密码都是 a ~ e 的小写字母,共 4 位密码,则通过排列所有4位密码即可暴力破解,代码如下:

func main() {
	f("abcde", "")
}

func f(candidates, result string) {
	if len(candidates) == 0 { // 递归终止条件
		fmt.Println(result)
		return
	}
	for _, c := range candidates {
		f(remove(candidates, c), result+string(c))
	}
}

func remove(str string, x rune) (ans string) {
	for _, c := range str {
		if c != x {
			ans += string(c)
		}
	}
	return
}

// 共120种密码, 如下:
abcde
abced
abdce
abdec
abecd
abedc
acbde
acbed
...

二、组合

世界杯总共32个球队,需要多少场比赛呢?

  • 如果区分主客场则需 32 ∗ 31 = 992 32 * 31 = 992 3231=992 场(排列),这实在是太多了
  • 如果不区分主客场则需 32 ∗ 31 / 2 = 496 32 * 31 / 2 = 496 3231/2=496 场,还是太多了
  • 如果改成小组赛+淘汰赛的形式呢:
    • 小组赛:8个小组,每个小组4个队共需 4 ∗ 3 / 2 = 6 4 * 3 / 2 = 6 43/2=6 场,共 8 * 6 = 48 场
    • 淘汰赛:因每个小组晋级两队则共16强,共需 8(16强得8强) + 4(8强得4强) + 2(4强得2强) + 2(冠亚1场、三四名1场) = 16 场淘汰赛
    • 则共需 48 + 16 = 64 场比赛,就是一个合理的场次了

组合是指,从 n 个不同元素中取出 m(1≤m≤n)个不同的元素。

  • 例如,我们前面说到的世界杯足球赛的例子,从 32 支球队里找出任意 2 支球队进行比赛,就是从 32 个元素中取出 2 个元素的组合。
  • 如果上文田忌赛马的规则改一下,改为从 10 匹马里挑出 3 匹比赛,但是并不关心这 3 匹马的出战顺序,那么也是一个组合的问题。
  • 对于所有 m 取值的组合之全集合,我们可以叫作全组合(All Combination)。例如对于集合{1, 2, 3}而言,全组合就是{空集, {1}, {2}, {3}, {1, 2}, {1,3} {2, 3}, {1, 2, 3}}。

假设某种运动需要 3 支球队一起比赛,那么 32 支球队就有 32x31x30 种排列,如果三支球队在一起只要比一场,那么我们要抹除多余的比赛。三支球队按照任意顺序的比赛有 3x2x1=6 场,所以从 32 支队伍里取出 3 支队伍的组合是 (32x31x30)/(3x2x1)。基于此,我们可以扩展成以下两种情况。
- n 个元素里取出 m 个的组合,可能性数量就是 n 个里取 m 个的排列数量,除以 m 个全排列的数量,也就是 (n! / (n-m)!) / m!。
- 对于全组合而言,可能性为 2 n 2^n 2n 种。例如,当 n=3 的时候,全组合包括了 8 种情况。

2.1 递归实现

例题:从 3 个元素中选取 2 个元素的组合。假设有 3 个队伍,t1,t2 和 t3。从图中我们可以看出,对于组合而言,由于{t1, t2}已经出现了,因此就无需{t2, t1}。同理,出现{t1, t3},就无需{t3, t1}等等。对于重复的,我用叉划掉了。这样,最终只有 3 种组合了。

在这里插入图片描述
如何用代码来实现呢?一种最简单粗暴的做法是:

  • 先实现排列的代码,输出所有的排列。例如{t1, t2}, {t2, t1};
  • 针对每种排列,对其中的元素按照一定的规则排序。那么上述两种排列经过排序后,就是{t1, t2}, {t1, t2};
  • 对排序后的排列,去掉重复的那些。上述两种排列最终只保留一个{t1, t2}。

这样做效率就会比较低,很多排列生成之后,最终还是要被当做重复的结果去掉。

显然,还有更好的做法。从图中我们可以看出被划掉的那些,都是那些出现顺序和原有顺序颠倒的元素。

例如,在原有集合中,t1 在 t2 的前面,所以我们划掉了{t2, t1}的组合。这是因为,我们知道 t1 出现在 t2 之前,t1 的组合中一定已经包含了 t2,所以 t2 的组合就无需再考虑 t1 了。因此,我只需要在原有的排列代码中,稍作修改,即每次传入嵌套函数的剩余元素,不再是所有的未选择元素,而是出现在当前被选元素之后的那些。代码如下:

public class Main {
	// @Description: 使用函数的递归(嵌套)调用,找出所有可能的队伍组合
	// @param teams- 目前还剩多少队伍没有参与组合,result- 保存当前已经组合的队伍
	public static void combine(ArrayList<String> teams, ArrayList<String> result, int m) {
		if (result.size() == m) {// 挑选完了 m 个元素,输出结果
			System.out.println(result);
			return;
		}
		for (int i = 0; i < teams.size(); i++) {
			ArrayList<String> newResult = (ArrayList<String>)(result.clone());
			newResult.add(teams.get(i));// 从剩下的队伍中,选择一队,加入结果
			ArrayList<String> rest_teams = new ArrayList<String>(teams.subList(i + 1, teams.size()));// 只考虑当前选择之后的所有队伍
			combine(rest_teams, newResult, m); // 递归调用,对于剩余的队伍继续生成组合
		}
	}
	public static void main(String[] args) {
		ArrayList<String> teams = new ArrayList<String>(Arrays.asList("t1", "t2", "t3"));
		combine(teams, new ArrayList<String>(), 2);
	}
}

2.2 应用

2.2.1 乱序搜索词组(多元文法)

组合在计算机领域中也有很多的应用场景。比如大型比赛中赛程的自动安排、多维度的数据分析以及自然语言处理的优化等等。

在搜索领域的一个应用如下:需求是把每篇很长的文章,分隔成一个个的单词,然后对每个单词进行索引,便于日后的查询。但是很多时候,光有单个的单词是不够的,还要考虑多个单词所组成的词组。例如,“red bluetooth mouse”这样的词组。

处理词组最常见的一种方式是多元文法。什么是多元文法呢?这词看起来很复杂,其实就是把临近的几个单词合并起来,组合一个新的词组。比如我可以把“red”和“bluetooth”合并为“red bluetooth”,还可以把“bluetooth”和“mouse”合并为“bluetooth mouse”。

设计多元文法只是为了方便计算机的处理,而不考虑组合后的词组是不是有正确的语法和语义。例如“red bluetooth”,从人类的角度来看,这个词就很奇怪。但是毕竟它还会生成很多合理的词组,例如“bluetooth mouse”。所以,如果不进行任何深入的语法分析,我们其实没办法区分哪些多元词组是有意义的,哪些是没有意义的,因此最简单的做法就是保留所有词组。

普通的多元文法本身存在一个问题,那就是定死了每个元组内单词出现的顺序。例如,原文中可能出现的是“red bluetooth mouse”,可是用户在查询的时候可能输入的是“bluetooth mouse red”。这么输入肯定不符合语法,但实际上互联网上的用户经常会这么干。

那么,在这种情况下,如果我们只保留原文的“red bluetooth mouse”,就无法将其和用户输入的“bluetooth red mouse”匹配了。所以,如果我们并不要求查询词组中单词所出现的顺序和原文一致,那该怎么办呢?

我当时就在想,可以把每个二元或三元组进行全排列,得到所有的可能。但是这样的话,二元组的数量就会增加 1 倍,三元组的数量就会增加 5 倍,一篇文章的数据保存量就会增加 3 倍左右。我也试过对用户查询做全排列,把原有的二元组查询变为 2 个不同的二元组查询,把原有的三元组查询变为 6 个不同的三元组查询,但是事实是,这样会增加实时查询的耗时。

于是,我就想到了组合。多个单词出现时,我并不关心它们的顺序(也就是不关心排列),而只关心它们的组合。因为无需关心顺序,就意味着我可以对多元组内的单词进行某种形式的标准化。即使原来的单词出现顺序有所不同,经过这个标准化过程之后,都会变成唯一的顺序。

例如,“red bluetooth mouse”,这三个词排序后就是“bluetooth,mouse,red”,而“bluetooth red mouse”排序后也是“bluetooth,mouse,red”,自然两者就能匹配上了。我需要做的事情就是在保存文章多元组和处理用户查询这两个阶段分别进行这种排序。这样既可以减少保存的数据量,同时可以减少查询的耗时。这个问题很容易就解决了。怎么样,组合是不是非常神奇?

此外,组合思想还广泛应用在多维度的数据分析中。比如,我们要设计一个连锁店的销售业绩报表。这张报表有若干个属性,包括分店名称、所在城市、销售品类等等。那么最基本的总结数据包括每个分店的销售额、每个城市的销售额、每个品类的销售额。除了这些最基本的数据,我们还可以利用组合的思想,生成更多的筛选条件。

2.2.2 抽奖

设计一个抽奖系统。从 100 个人中,抽取三等奖 10 名,二等奖 3 名,一等奖 1 名。请列出所有可能的组合,注意每人最多只能被抽中 1 次。

这道题是用到了组合及排列,先看100个人里取1人的数量是C100,1 (格式问题,C100,1表示从100人里取1人的组合数量),剩下99人里取3人为C99,3,再剩下96人里取10人为C96,10,然后再利用排列,总共可能为C100,1 x C99,3 x C96,10

思路1:
先运行combine(100, 1),将所有结果保存。
然后用一层迭代对每个结果运行combine(99, 3),将所有结果append进去。
然后再来一层迭代对上一结果运行combine(96, 10),同样依次append进去。
此处的关键点在于每个迭代下得将上一结果中的数拿掉,以及得保存临时结果。
此思路也等价于直接上三个嵌套循环+运行递归程序。
combine()函数见上文

思路2:
先运行combine(100, 14),对每个结果运行combine(14, 10),再对每个更新的结果运行combine(4, 3)。其实就是思路1逆过来。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数学】2、排列、组合 的相关文章

  • 如何使用固定数量的工作线程实现简单线程

    我正在寻找最简单 最直接的方法来实现以下内容 主程序实例化worker 执行任务的线程 Only n任务可以同时运行 When n已达到 不再有工人 开始直到计数 正在运行的线程回落到下方n 我觉得Executors newFixedThr
  • 如果列名不同,则一对多休眠连接

    我有三个具有以下结构的表 合同 gt Contract id 主要 customer company id Vendor company id 公司 gt Company id 主要 创建日期 创建者 Company Timeline gt
  • ScheduledThreadPoolExecutor如何在特定时间运行任务?

    特别是 它是否像这样在内部实现了 while true 循环 while System currentTimeMillis lt timeToRunTask Thread sleep 1000 doTask From http grepco
  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 如何在 Java 中访问嵌套的 HashMap?

    我有一个 Java 中的 HashMap 其中的内容 你们可能都知道 可以通过以下方式访问 HashMap get keyname 如果一个 HashMap 位于另一个 HashMap 中 即嵌套的 HashMap 我将如何访问内容 我可以
  • 在 Java 中从 SOAPMessage 获取原始 XML

    我已经在 J AX WS 中设置了 SOAP WebServiceProvider 但我无法弄清楚如何从 SOAPMessage 或任何 Node 对象获取原始 XML 下面是我现在获得的代码示例 以及我试图获取 XML 的位置 WebSe
  • 如何为小程序提供对文件系统写入的访问权限

    我在设置小程序的策略文件时遇到问题 我是第一次这样做 不知道如何在java中设置小程序的策略文件 实际上我想授予小程序在文件系统上写入的权限 为此我必须向小程序授予文件权限 所以我创建了一个名为 java policy 的文件 并将以下代码
  • 使用 JSch 分别为各个提示提供输入

    问题是 SSH 连接需要在常规登录后提供另一个用户 ID 和密码信息 我正在使用 JSch 连接到远程服务器 它接受以下形式的输入InputStream 和这个InputStream只能通过一次 由于会话是交互式的 这会导致问题 我尝试将输
  • Java - JPanel 内有边距和 JTextArea

    我想创建这样的东西 主面板有其边距 x 并且 TextArea 位于该面板的中心 几乎填满了面板 底部是另一个具有自定义尺寸 高度 y 的面板 可以使用某些快捷方式将其切换为可见和不可见 底部面板有 FlowLayout 和几个元素 问题是
  • java.lang.Object的hashCode具体使用的算法是什么

    中使用的算法是什么JVM实施java lang Object的隐含的hashCode 方法 OpenJDK or Oracle JDK答案中首选 它依赖于实现 并且在很大程度上 该算法是entirely取决于实施 只要它是一致的 但是 根据
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 更改 JComboBox 中滚动条的大小

    有谁知道如何手动更改 jComboBox 中的滚动条大小 我已经尝试了一大堆东西 但没有任何效果 好吧 我明白了 您可以实现 PopUpMenuListener 并使用它 public void popupMenuWillBecomeVis
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • Jetty Plugin 9启动不喜欢icu4j-2.6.1.jar

    我对 mortbay 的 Maven jetty 插件 6 有相同的配置
  • Java8:流映射同一流中的两个属性

    我有课Model带有以下签名 class Model private String stringA private String stringB public Model String stringA String stringB this
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 在 Freemarker 模板中检查 Spring 安全角色和记录的用户名

    有谁知道 freemarker 标签来检查 freemarker 文件中的 spring 安全角色和用户名 我从网络上的几个资源中发现以下代码将打印登录的用户名 但它没有打印用户名 而是打印 登录为
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 使用自定义比较器在 Java 中创建 SortedMap

    我想创建一个TreeMap在 Java 中具有自定义排序顺序 排序后的键是字符串 需要根据第二个字符进行排序 这些值也是字符串 示例地图 Za FOO Ab Bar 您可以像这样使用自定义比较器 Comparator

随机推荐

  • vue中使用vditor(发布,编辑,详情回显、上传图片+粘贴图片回显问题,表情的处理)

    文章目录 1 使用方法 1 html 2 dom 发布和编辑页面 3 详情页面 1 页面 2 引入 3 dom 效果图 补充遗漏的XSS过滤 1 注入脚本 2 过滤方法 3 在input val 中调用 补充防盗链功能 此方法有视觉变化 3
  • 获取和设置tinyMCE 4编辑器的内容

    对于tinymce编辑器是无法通过js进行内容的读写的 必须使用编辑器自身的方法才行 下面是一些方法 希望能对用到的朋友有所帮助 1 如果当前页面只有一个编辑器 获取内容 tinyMCE activeEditor getContent 设置
  • STL中set的基本介绍

    STl中的基本内容 容器 set multiset 在集合中 所有的元素只能出现一次 并且默认按照元素的值从小到大自动排序 set不能通过迭代器来修改元素的值 即set的迭代器是一种const iterator multiset 和 set
  • 从摄影测量到计算机视觉----以SFM算法为例,用python+opencv 实现

    因为这篇公式和图比较多 所以笔者以贴图像的形式来 附上最终的结果图 如果你需要笔者的代码 可以发邮件或者去github 笔者后续会贴上github链接 1 两者之间的关系 摄影测量是研究被摄物体的形状 大小 和相对位置关系的一门学科 计算机
  • 【今日CV 计算机视觉论文速览 第109期】Wed, 1 May 2019

    今日CS CV 计算机视觉论文速览 Wed 1 May 2019 Totally 40 papers 上期速览 更多精彩请移步主页 Segmentations is All You Need 提出了一种无须锚点和非极大值抑制的目标检测方法
  • 【华为OD统一考试B卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • Python打印颜色

    author skate time 2014 09 28 Python打印颜色 格式 033 显示方式 前景色 背景色m 说明 前景色 背景色 颜色 30 40 黑色 31 41 红色 32 42 绿色 33 43 黃色 34 44 蓝色
  • java md5签名首位为0时被忽略

    由于hex加密时0不被解析 即0x0001和0x1在表现上都是1只是占用内存大小不同 而如果数字相同自动0x01和0x1加密出来是一样的 所以0x01无论前面有几个0都会去掉 平常使用MD5加密时 自己封装处理时 常见有2个问题 1 转换为
  • ESP32(MicroPython)摇杆控制舵机

    主程序 橙色 信号线 gt 17 红色 电源正 gt 5V 褐色 电源负 gt GND 导入Pin模块 from machine import Pin import time from servo import Servo from mac
  • Springboot生成二维码

    Springboot生成二维码整合 我们使用两种方式 去生成二维码 但是其实 二维码的生成基础 都是zxing包 这是Google开源的一个包 第一种是使用原始的zxing方式去实现 第二种是使用hutool来实现 hutool其实也是对于
  • 关于source insight提示source insight can't create file的解决方法

    如果运行程序 提示错误 source insight can t create file 原因是安装路径或者project存放的路径中出现了中文 解决的方法挺简单的 在它提示无法创建的文件路径下创建相应的文件夹 然后重新打开程序会出现一大堆
  • java-批量下载文件,并且为每个文件创建文件夹,最后合并成一个压缩包

    前言 通过文件url批量下载文件 并且每一个文件创建一个文件夹 以此分类 最后统一打成一个压缩包 一 代码示例 public void download List
  • node.js使用xlsx实现Excel生成及读取

    xlsx工具npm地址 https www npmjs com package xlsx 生成excel 导出 将数据导出成excel方法 下面介绍两种方式 一种是将数组数据导出成excel 一种是将json数据导出成excel 都非常简单
  • Spring Cloud Contract 简单实践

    Demo思路 创建两个微服务 producer consumer consumer服务在service内部使用Feign调用producer服务提供的API 这样在consumer打包时会访问Test测试的配置完成集成测试 1 maven
  • 【IDEA/eclipse】svn导出maven多模块项目

    一 IDEA从snv导出maven多模块项目 前提 maven配置好 svn配置好 File New Project from Version Control 找到项目 check out Slf4j中log报错 百度说少插件 Settin
  • Qt中QObject::connect()的lambda用法

    原创 Qt中QObject connect 的lambda用法 2019 09 29 21 43 05 三公子Tjq 阅读数 55 收藏 更多 分类专栏 Qt基础知识 版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议
  • You have 18 unapplied migration(s). Your project may not work properly until you apply the migration

    成功解决错误 You have 18 unapplied migration s Your project may not work properly until you apply the migrations for app s adm
  • Flutter组件 等待圈CircularProgressIndicator

    strokeWidth 用于绘制圆的线条的宽度 backgroundColor 背景颜色 value 如果为非null 则该进度指示器的值为0 0 对应于没有进度 1 0对应于所有进度 valueColor 动画的颜色值 在flutter中
  • sqlilab 20-28a之看不懂的教程

    第二十关 接着上面19关的方法 我这里用正确的账号密码登录后发现页面显示了我的Cookie 立刻联想到Cookie注入 还是一样用Burp进行抓包 通过修改Cookie对上面的猜想进行验证 先构造出 uname admin 之后页面出现报错
  • 【数学】2、排列、组合

    文章目录 一 排列 1 1 田忌赛马 1 2 暴力破解密码 二 组合 2 1 递归实现 2 2 应用 2 2 1 乱序搜索词组 多元文法 2 2 2 抽奖 一 排列 排列的定义 从 n 个不同的元素中取出 m 1 m n 个不同的元素 按照