算法
文章平均质量分 66
长安明月
这个作者很懒,什么都没留下…
展开
-
经典过河问题:四个人 17 分钟过桥
有四个人需要过桥,天色比较暗,过桥必须用手电筒。但是手电筒只有一个,每次最多两个人过桥,所以必须有人把手电筒来回带。A、B、C、D 四个人过桥分别需要1,2,5,10 分钟,两个人过桥速度以慢的为准。请问如何过桥使得总时间最短?(最短总时间是 17 分钟)。解决这个问题的关键,就是返回去的人必须用时最少。而且,尽量让 5 分钟和 10 分钟的俩人一起走,节约更多的时间。原创 2023-12-11 09:44:42 · 1611 阅读 · 0 评论 -
java.security.NoSuchAlgorithmException: SHA256WithRSAandMGF1 Signature not available
SHA256WithRSAandMGF1 是 BC Provider 提供的一个签名算法,而 JDK 1.8 的 java.security.* 包中并没有这个 Provider。运行如下代码,可以打印 JDK 中的 Provider 列表,以及所有签名算法。可以看到,BC Provider 已经被添加到列表中,且 SHA256WithRSAandMGF1 算法也在支持的签名算法列表中。再次运行签名方法,异常问题已经被修复,能正确对数据进行签名。笔者在做 RSA 签名时,遇到了一个异常,详见下文。...原创 2022-08-04 14:48:13 · 6313 阅读 · 0 评论 -
Java 使用 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING 算法解密
Java 实现 RSA 解密(算法模式为 RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING),代码如下。原创 2022-08-04 11:16:01 · 2800 阅读 · 1 评论 -
java.security 框架之签名、加密、摘要及证书
单向加密是不可逆的,MD5、SHA、MAC 都是单向加密算法,也称之为摘要算法。MD5、SHA 会根据明文用哈希算法计算一个固定长度的摘要(哈希值),然后把明文和摘要发送给接收者,接收者根据同样的算法计算出摘要,对比两个摘要是否一样即可验证明文的正确性。它的应用场景是防止报文被篡改和校验数据。MD5、SHA 等算法是开源的,容易被试探出来。有没有更安全的摘要算法呢?HMAC(带密钥的哈希函数),用一个密钥和一个明文消息作为输入,生成一个消息摘要。.........原创 2022-08-03 16:57:59 · 1939 阅读 · 0 评论 -
RSA 加解密(Java 实现)
RSA 算法是一种非对称加解密算法。服务方生成一对 RSA 密钥,即公钥 + 私钥,将公钥提供给调用方,调用方使用公钥对数据进行加密后,服务方根据私钥进行解密。原创 2022-08-03 16:18:34 · 29982 阅读 · 7 评论 -
辗转相除法求最大公约数的原理及 Java 实现
一、什么是辗转相除法? 辗转相除法可以求得两个数的最大公约数。辗转相除法又称欧几里得算法,用于计算两个非负整数 a,b 的最大公约数。应用领域有数学和计算机等,计算公式 gcd(a, b) = gcd(b, a mod b)。二、举例说明计算过程 假如需要求 100 和 18 这两个正整数的最大公约数,用欧几里得算法,计算过程是这样的:100 / 18 = 5 (余 10)18 / 10= 1 (余 8)10 / 8 = 1 (余 2)8 / 2 = 4 (余 0)至此,最大公约数为 2原创 2022-05-20 11:11:37 · 3125 阅读 · 0 评论 -
Java 计算 2 个集合(List<String>)的差集
问题描述:有一个大表集合 A 和一个小表集合 B,需要找出这两个集合之间的差集,即在 A 中存在但在 B 中不存在的集合。解决思路:将小表集合 B 转成一个 HashSet;遍历大表全量数据,判断元素在 HashSet 中是否存在,如果不存在,就放到一个临时 List 中;最后将临时 List 返回。算法实现:package com.test;import java.util.ArrayList;import java.util.HashSet;import java.util.L原创 2020-08-13 15:26:35 · 4100 阅读 · 0 评论 -
乱序且不重复的输出0-99之间的所有整数
如何高效且不重复的输出0 - 99 之间的所有整数?实现思路如下:(1) 把N个数放到容器A(int数组)中;(2) 从N个数中随机取出1个数,放入容器B(int数组)中;(3) 把容器A中最后一个数与随机抽取的数对调,或者把容器A中最后一个数覆盖随机抽取出来的数;(4) 这时从容器A(假设N个数,索引 0 到 索引 N-2)之间随机取一个数,再放入容器B中,重复此步骤。说明:也就是说...原创 2019-04-10 20:09:33 · 1367 阅读 · 0 评论 -
字符串调整顺序与还原
输入一个字符串,如何将字符随机打乱顺序,生成新的字符串?且新字符串仍可还原为原字符串。一、正变换思路:1、计算出待变换的字符串长度 length ,生成一个长度为 length 的 int 数组,且数组中的各个值为0 - (length - 1) 之间的所有整数值。2、将原字符串按照整形数组设置的规则做相应变换,得出变换后的字符串。例如,原字符串为 “bcKM1A7B3q”,字符串长度...原创 2019-04-10 22:05:29 · 4027 阅读 · 0 评论