Java算法之数论基础

Java算法之数论基础

一、最大公约数(Greatest Common Divisor, GCD)

在Java中,我们可以使用欧几里得算法(辗转相除法)来求两个数的最大公约数:

辗转相除法(欧几里得算法)

辗转相除法,也称为欧几里得算法(Euclidean Algorithm),是一种用于计算两个非负整数最大公约数(Greatest Common Divisor, GCD)的经典算法。该算法基于这样一个事实:对于任何两个非零自然数a和b,它们的最大公约数等于a除以b的余数c和b之间的最大公约数。

算法步骤如下:

  1. 初始化两个整数ab,其中a >= bb > 0。
  2. 计算a除以b的余数,记作r(即r = a % b)。
  3. 如果r为0,则b就是ab的最大公约数。
  4. 否则,令a等于原来的bb等于刚才得到的余数r,然后回到第二步继续迭代。

下面是Java实现辗转相除法求最大公约数的代码:

public static int gcd(int a, int b) {// 确保a >= bif (a < b) {int temp = a;a = b;b = temp;}// 辗转相除直到余数为0while (b != 0) {int remainder = a % b;a = b;b = remainder;}// 这时a就是a和b的最大公约数return a;
}

这个算法的关键在于通过不断替换较大的数为较小数和余数,使得每次迭代中,两个数的差值逐渐缩小,并最终找到它们的最大公约数。由于每次迭代都会使其中一个数至少减小一半,因此该算法具有较高的效率。

除了辗转相除法,还有其他几种算法,但是与辗转相除法相比,效率会稍微差一些,下面列举几种其他算法:

  1. 更相减损法
    更相减损法是中国古代数学家刘徽提出的求解最大公约数的方法,其原理是连续用较大数减去较小数,直至两数相等,此时的数即为两数的最大公约数。但这种方法在数值相差悬殊的情况下迭代次数可能会较多,不如辗转相除法高效。

    例如,对于数a和b,先比较a和b的大小,若a>b,则用a-b并将结果代替a;若a<b,则用b-a并将结果代替b。重复上述过程,直到a=b为止。

  2. 素因数分解法
    将两个数分别进行素因数分解,找出它们共有的素因数,并把相同的素因数各取最小指数次幂相乘,所得积即为两数的最大公约数。这种方法直观易理解,但对于大数可能不如辗转相除法快速有效。

    相同的素因数各取最小指数次幂相乘,这似乎有些拗口,对它简单解释一下,举个例子

a = 12 = 2 2 × 3 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ b = 18 = 2 1 × 3 2 a = 12 = 2² × 3¹ ······ b = 18 = 2¹ × 3² a=12=22×31⋅⋅⋅⋅⋅⋅b=18=21×32

a和b这两个数,有2和3这两个相同的素因数,在a中,2的指数是2,在b中,2的指数是1,那么素因数2的最小指数次幂就是1,3同理也是1。

但是对于找最大公约数这个问题,素数分解法明显麻烦许多,因为光是找共同的素因数,就已经比较麻烦了,所以个人并不推荐用这种方法来求最大公约数。只是提供一个思想。

以上方法各有特点,对于不同的应用场景和需求可以选择最合适的算法。在大多数情况下,特别是中小规模的整数求最大公约数,辗转相除法是最常用且效率最高的。

二、最小公倍数(Least Common Multiple, LCM)

最小公倍数,当看到这个题目时,我们可能最先想到拿较小的那个数加倍,然后判断另一个数能否被整除,这里提供另一个方法

求两个正整数 (a) 和 (b) 的最小公倍数的一种常见方法是利用它们的最大公约数,记作 (gcd(a, b))。根据数学性质,(a) 和 (b) 的最小公倍数可以通过它们的乘积除以它们的最大公约数来得到:

L C M ( a , b ) = ∣ a × b ∣ g c d ( a , b ) LCM(a, b) = \frac{|a \times b|}{gcd(a, b)} LCM(a,b)=gcd(a,b)a×b
这里的绝对值符号仅是为了确保在 (a) 或 (b) 中有负数时仍能得出正确的结果,但由于最小公倍数定义应用于正整数,所以一般情况下 (a) 和 (b) 都是正数,因此实际上不需要取绝对值。

如果你已经知道 (a) 和 (b) 的最大公约数,可以直接套用上述公式。若不知道最大公约数,可以先用例如欧几里得算法或者其他更高级的算法来求出 (gcd(a, b))。

举个例子,假设要找出 (a = 12) 和 (b = 18) 的最小公倍数:

首先计算它们的最大公约数 (gcd(12, 18))。我们可以直接使用欧几里得算法,计算出他们的最大公约数为6。

接下来,代入上面的公式计算最小公倍数:

L C M ( 12 , 18 ) = 12 × 18 6 = 36 LCM(12, 18) = \frac{12 \times 18}{6} = 36 LCM(12,18)=612×18=36
所以,(12) 和 (18) 的最小公倍数是 (36)。

三、快速幂算法

Java快速幂算法是一种高效的算法,用于计算任意数 a 的非负整数指数 n 的次方,即计算 (a^n) 的值。传统方法是通过连续乘法,时间复杂度为 (O(n)),但快速幂算法利用了指数运算法则以及二进制表示,将时间复杂度降低到了 (O(\log_2 n))。

快速幂的基本思想:

  1. 将指数 n 转换成二进制形式,例如 n = b_{m-1}...b_1b_0,其中 (b_i) 是二进制位。
  2. 利用指数的二进制表示,将 (a^n) 分解成一系列的平方操作和乘法操作。
    • 对于每一位 (b_i),如果它是1,则我们需要将当前的结果与基数 a 相乘;如果是0,则不需要。
    • 因为每次都是平方后选择性地乘以基数,所以问题转化为 (a{2k}) 的计算,这可以通过递归或者循环迭代完成。

以下是一个基本的Java实现示例:

public long power(long base, int exponent) {// 边界条件//当指数为0时,返回结果1if (exponent == 0)return 1;//当底数为0时,返回结果0if (base == 0)return 0;//定义初始化结果为1long result = 1;//定义一个数记录每次循环后的平方数long currentBase = base;//将指数转换为二进制并从最高位开始处理while (exponent != 0) {// 进行与运算,如果当前位是1,则进行乘法if ((exponent & 1) != 0) {result *= currentBase;}//把基数平方,因为此时是二进制的表示,如果为1的话,那么就代表要乘这个数两次currentBase *= currentBase;//移动到下一个二进制位exponent >>= 1;}return result;
}

对于需要同时计算 a^n 对某个模数 p 取模的情况,即求 (a^n mod p),可以在每一步乘法后立即对结果取模,避免溢出:

public long powerModulo(long base, int exponent, long mod) {//边界条件if (base == 0)return 0;if (exponent == 0)return 1;//初始化结果long result = 1;//基数为底数模上modlong currentBase = base % mod;//将指数转换为二进制并从最高位开始处理while (exponent != 0) {if ((exponent & 1) != 0) {//对结果乘上基数,并模上modresult = (result * currentBase) % mod;}currentBase = (currentBase * currentBase) % mod;exponent >>= 1;}return result;
}

这样,无论 n 多大,都可以高效地计算出 an 次幂及其模运算结果。

对于取模运算的性质,(result * currentBase * currentBase)%mod = result %mod * currentBase % mod * currentBase % mod,所以每次计算都需要对结果取模。

四、矩阵快速幂

矩阵快速幂常用于处理矩阵乘法连乘问题,比如在某些数论和图论问题中:

矩阵快速幂就只是把乘法换成了矩阵乘法,掌握了快速幂运算再去学矩阵快速幂就很简单了,难一些的地方可能就是矩阵的乘法需要掌握。

public static int[][] matrixPower(int[][] matrix, int p) {int n = matrix.length;//初始化矩阵为单位矩阵int[][] res = new int[n][n];for (int i = 0; i < n; i++) {res[i][i] = 1;} while (p > 0) {if ((p & 1) != 0) { // 如果p是奇数res = multiply(res, matrix);}matrix = multiply(matrix, matrix); // 把matrix自乘p >>= 1; // p /= 2 (right shift)}return res;
}
// 定义矩阵乘法函数multiply
public static int[][] multiply(int[][] matrixA, int[][] matrixB) {//n为第一个数组的行数,m为第二个数组的列数,p为第二个数组的行数int n = matrixA.length, p = matrixB.length, m = matrixB[0].length;//过第二个数组的行数不等于第一个数组的列数,不能相乘if (p != matrixA[0].length)return null;int[][] ans = new int[n][m];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++) {for (int k = 0; k < p; k++)ans[i][j] += (matrixA[i][k] % mod) * (matrixB[k][j] % mod) % mod;ans[i][j] = ans[i][j] % mod;}return ans;}

五、高斯消元法

高斯消元用于求解线性方程组,不过在数论中可能更多的是用于理论推导和简化问题:

// 假设A是一个n*n的系数矩阵,b是一个n*1的常数列组成的数组,组合起来形成增广矩阵[A|b]
// 下面的代码将求解线性方程组Ax=bpublic class GaussElimination {public static double[] solveLinearEquations(double[][] augmentedMatrix) {int n = augmentedMatrix.length;for (int i = 0; i < n; i++) {// 1. 选择主元(pivot): 通常选当前行中绝对值最大的元素对应的列,若有零元素则尝试交换行int maxPivotRowIndex = findMaxPivotRowIndex(i, augmentedMatrix, n);// 交换行(如果当前行的主元不是最大的)swapRows(i, maxPivotRowIndex, augmentedMatrix);// 2. 主元归一化:将主元所在的行除以其主元值,使其变为1double pivot = augmentedMatrix[i][i];divideRowByItsPivot(i, pivot, augmentedMatrix);// 3. 消元:逐行消除当前主元下方元素for (int j = i + 1; j < n; j++) {double factor = augmentedMatrix[j][i] / augmentedMatrix[i][i];subtractMultipleFromRow(j, i, factor, augmentedMatrix);}}// 解决得到的上三角矩阵(RREF),从底部向上回代求解double[] solutions = new double[n];for (int i = n - 1; i >= 0; i--) {solutions[i] = augmentedMatrix[i][n] / augmentedMatrix[i][i];for (int j = i - 1; j >= 0; j--) {augmentedMatrix[j][n] -= augmentedMatrix[j][i] * solutions[i];}}return solutions;}// 辅助方法private static int findMaxPivotRowIndex(int startRow, double[][] matrix, int n) {double maxPivot = Math.abs(matrix[startRow][startRow]);int maxRowIndex = startRow;for (int i = startRow + 1; i < n; i++) {if (Math.abs(matrix[i][startRow]) > maxPivot) {maxPivot = Math.abs(matrix[i][startRow]);maxRowIndex = i;}}return maxRowIndex;}private static void swapRows(int row1, int row2, double[][] matrix) {double[] tempRow = matrix[row1];matrix[row1] = matrix[row2];matrix[row2] = tempRow;}private static void divideRowByItsPivot(int rowIndex, double pivot, double[][] matrix) {for (int j = rowIndex; j < matrix[rowIndex].length; j++) {matrix[rowIndex][j] /= pivot;}}private static void subtractMultipleFromRow(int targetRow, int sourceRow, double factor, double[][] matrix) {for (int j = sourceRow; j < matrix[targetRow].length; j++) {matrix[targetRow][j] -= factor * matrix[sourceRow][j];}}
}

六、素数筛法

埃拉托斯特尼筛法(Sieve of Eratosthenes)用于生成一定范围内的素数序列:

原理就是把2的倍数,3的倍数等等都标记一下,那么剩下的就是素数了,代码如下

public class PrimeSieve {//筛选public static boolean[] sieveOfEratosthenes(int limit) {//初始化数组,先把数据都初始化为trueboolean[] isPrime = new boolean[limit + 1];for (int i = 2; i <= limit; i++) {isPrime[i] = true;}// 基本原理:标记2的倍数(除了2本身),接着标记3的倍数(除了3本身),以此类推...for (int p = 2; p * p <= limit; p++) {if (isPrime[p]) {  // p是素数for (int i = p * p; i <= limit; i += p) {isPrime[i] = false;  // 将p的倍数标记为非素数}}}return isPrime;}
//筛选素数public static List<Integer> getPrimesUpTo(int limit) {boolean[] primes = sieveOfEratosthenes(limit);List<Integer> primeList = new ArrayList<>();for (int i = 2; i <= limit; i++) {if (primes[i]) {primeList.add(i);}}return primeList;}public static void main(String[] args) {int limit = 100;List<Integer> primes = getPrimesUpTo(limit);System.out.println("素数列表(小于或等于 " + limit + "):");System.out.println(primes);}
}

七、唯一分解定理

唯一分解定理指出每个大于1的整数都可以唯一地表示为若干个素数的积的形式。在Java中可以编写函数寻找一个数的所有素数因子:

public static class PrimeFactorization {// 定义一个方法primeFactorize,接收一个整数参数n,用于计算并输出n的质因数分解public static void primeFactorize(int n) {// 使用HashMap来存储质因数及其对应的幂次Map<Integer, Integer> factors = new HashMap<>();// 遍历从2到n的平方根的所有整数,因为一个合数的最大质因数不会超过其平方根for (int i = 2; i <= Math.sqrt(n); i++) {// 当n能被当前整数i整除时,进入循环内部while (n % i == 0) {// 在factors映射表中,将质因数i作为键,幂次作为值。如果i已经在映射表中,则增加其幂次(值+1);否则插入新的键值对,幂次初始化为1factors.put(i, factors.getOrDefault(i, 0) + 1);// 更新n的值,去除已找到的质因数i的影响n /= i;}}// 检查是否还有未处理的质因数,即n本身(当n为质数时)if (n > 1) {// 将n作为质因数放入映射表中,并将幂次初始化或增加为1factors.put(n, factors.getOrDefault(n, 0) + 1);}// 输出质因数分解结果System.out.println("质因数分解结果:");// 遍历映射表中的所有条目(键值对)for (Map.Entry<Integer, Integer> entry : factors.entrySet()) {// 获取当前质因数和对应的幂次int prime = entry.getKey();int power = entry.getValue();// 格式化输出质因数和幂次System.out.printf("%d^%d ", prime, power);}}// 主函数,用于测试primeFactorize方法public static void main(String[] args) {// 设置要分解的数,例如120int numberToFactorize = 120;// 调用primeFactorize方法进行质因数分解并输出结果primeFactorize(numberToFactorize);}}

**在上述提供的质因数分解代码中,我们并没有显式地检查每个 i 是否为质数。但实际上是隐含了这个性质:**由于我们是从2开始,每次找到一个能够整除 n 的数 i 后,都会立刻更新 n 的值为 n / i,并且将 i 作为质因数存储到 factors 中。这样做的结果保证了 i 必然是质因数,原因如下:

  1. 我们从2开始,2是最小的质数。
  2. 对于每个可能的 i,只有当 n 能被 i 整除(即 n % i == 0)时,才会将 i 视为一个质因数,并将 n 更新为 n / i。这意味着 i 必须是 n 的一个因数,而且由于我们在找质因数,因此 i 必须是一个质数(因为它不能由更小的质数相乘得到)。
  3. 如果 i 不是质数,那么它可以表示为其他质数的乘积,而这些更小的质数肯定会在之前已经被找出并从 n 中消去,所以当轮到 i 时,n 不会被 i 整除。

总之,虽然代码中没有明确写出判断 i 是否为质数的语句,但在整个分解过程中,实际找到的每个 i 都满足质因数的条件,这是因为分解的过程基于了质数的定义和性质。同时,由于我们仅检查到 Math.sqrt(n) 范围内的数,这也保证了不会遗漏大于 Math.sqrt(n) 的质因数,因为任何大于 Math.sqrt(n) 并且小于等于 n 的合数都必定包含至少一个不大于 Math.sqrt(n) 的质因数。

factors.getOrDefault(i, 0) + 1 这句代码在Java集合框架中,特别是对于 Map 接口的实现类(如 HashMap)中使用,用来获取与指定键 i 关联的值,如果该键不存在于 Map 中,则返回默认值 0

具体来说:

  • factors.getOrDefault(i, 0):这会尝试从 factors 映射表中获取键为 i 的值。如果 i 已经存在于映射表中,就返回对应的值;如果 i 不存在于映射表中,则返回默认值 0
  • + 1:接着对获取的结果(无论它是从映射表中得到的实际值还是默认值 0)加1,表示增加质因数 i 的幂次。

在质因数分解的过程中,这句代码的目的是统计每个质因数 i 出现的次数。每当我们发现 n 可以被 i 整除时,就认为找到了一次 i 这个质因数,于是就增加它在映射表中的计数(幂次)。如果 i 刚刚被发现,那么它在映射表中的值就是默认值 0,加1之后就变为 1,表示出现了1次;如果 i 已经出现过,那么增加的就是之前记录的次数基础上再加1。

八、约数定理

约数定理描述了正整数的约数个数与它的素因数分解之间的关系。在Java中可以实现函数计算一个数的约数个数:

Java中并不直接提供有关约数定理的内置功能或API,但你可以根据约数定理的数学原理编写程序来计算一个数的所有约数数量或列出所有约数。

约数定理(也称为约数个数定理)表明,对于一个正整数 ( n ) 可以写成质因数分解的形式:

n = p 1 a 1 × p 2 a 2 × ⋯ × p k a k n = p_1^{a_1} \times p_2^{a_2} \times \cdots \times p_k^{a_k} n=p1a1×p2a2××pkak
其中 ( p_1, p_2, …, p_k ) 是不同的质数,而 ( a_1, a_2, …, a_k ) 是正整数。根据约数定理,( n ) 的正约数总数为:

d ( n ) = ( a 1 + 1 ) × ( a 2 + 1 ) × ⋯ × ( a k + 1 ) d(n) = (a_1 + 1) \times (a_2 + 1) \times \cdots \times (a_k + 1) d(n)=(a1+1)×(a2+1)××(ak+1)
下面是一个简单的Java示例,展示了如何利用约数定理计算一个数的约数个数:

import java.util.HashMap;
import java.util.Map;public class DivisorCount {public static int countDivisors(int n) {Map<Integer, Integer> primePowers = new HashMap<>();// 分解质因数并记录每个质因数的幂次for (int i = 2; i * i <= n; i++) {while (n % i == 0) {primePowers.put(i, primePowers.getOrDefault(i, 0) + 1);n /= i;}}// 如果n大于1,意味着还有一个未记录的质因数(n自身)if (n > 1) {primePowers.put(n, primePowers.getOrDefault(n, 0) + 1);}// 计算约数个数int divisorCount = 1;for (int power : primePowers.values()) {divisorCount *= (power + 1);}return divisorCount;}public static void main(String[] args) {int number = 120;System.out.println("Number of divisors of " + number + ": " + countDivisors(number));}
}

这段代码首先找到给定整数的所有质因数及每个质因数的幂次,然后利用约数定理公式计算约数的数量。请注意,这段代码并没有直接使用“约数定理”的名称,但它体现了约数定理的内容和应用。

九、反素数

反素数是指其真因数个数(不包括1和自身)为素数的正整数。在Java中,可以先确定一个数的所有真因数,再检查其数量是否为素数:

public static boolean isPermutablePrime(int n) {int divisorsCount = countDivisors(n) - 2; // 减去1和自身return isPrime(divisorsCount);
}// isPrime 是前面定义过的判断素数的辅助函数

总结,数论算法在Java编程中有着广泛的应用,理解和熟练掌握这些基础算法对于解决各类问题至关重要。上述代码仅为简要示例,实际编程时请根据具体需求和数据规模加以优化和完善。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会议室预约系统优化(蓝桥杯)

文章目录 会议室预约系统优化问题描述差分 会议室预约系统优化 问题描述 假设你是一家大型企业的 IT 工程师&#xff0c;企业内有 n 个会议室&#xff0c;每天都有多个部门预约会议室进行会议。你的任务是优化现有的会议室预约系统。 你需要设计一个程序来支持以下两种操作…

Web3社交项目UXLINK零撸教程

简介&#xff1a;UXLINK是Web3行业中首个主打双向、熟人社交关系的产品&#xff0c;与其他社交基础设施类项目相比&#xff0c;类似Twitter Vs Facebook、微博 Vs 微信的社交结构区别。UXLINK的愿景&#xff1a;1、社交中心&#xff1a;成为最大的社交平台&#xff0c;专注于真…

goctl-swagger 生成json接口文件

参考&#xff1a; GitHub - dyntrait/goctl-swagger: 通过 api 文件生成 swagger 文档 GitHub - Bluettipower/goctl-swagger 一:编译 执行go install 前一般需要设置环境&#xff0c;不然资源经常会下载不下载 go env -w GOPROXYhttps://goproxy.cn,direct 执行完 go in…

C++/CLI学习笔记4(快速打通c++与c#相互调用的桥梁)

3.4声明多个变量 同一个语句可声明同类型的多个变量&#xff0c;用逗号分隔即可&#xff0c;如下所示:int x 10, y, z 11; 该语句声明int变量x,y和z。第一个初始化为10&#xff0c;第二个未初始化&#xff0c;第三个初始化为11。 3.5变量赋值 使用赋值操作符(等号)向变量…

IO流(主要是记住四大类InputStream,OutputStream、Reader和Writer,其他都是他们的子类)

IO流 1、文件 &#xff08;1&#xff09;文件概念 文件就是保存数据的地方。例如word文档&#xff0c;txt文件&#xff0c;execl文件等等。 &#xff08;2&#xff09;文件流 文件在程序中是以流的形式来操作的。 流&#xff1a;数据在数据源&#xff08;文件&#xff09;…

【Python】Python中的正则表达式

Python中的正则表达式 1.re模块使用入门 1.1 re.match 函数 函数定义&#xff1a; re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match() 就返回 none。 函数语法&#xff1a; re.match(pattern, string, flags0) …

ASR语音识别纠错-fast correct

1、使用方式说明 ASR对应的文本越长&#xff0c;识别准确率和召回率越高 识别的错误分类&#xff1a; 编号错误类型示例1谐音字词配副眼睛-配副眼镜2混淆音字词流浪织女-牛郎织女3多字错误关关机-关机4少字错误 爱有天意-假如爱有天意 5形似字错误高梁-高粱6中文拼音全拼xin…

二叉树【Java】

二叉树遍历 前序遍历 中序遍历 后续遍历 代码 前 中 后序遍历 package Trww;public class TreeTraversal {/*12 34 5 6*/public static void main(String[] args) {TreeNode tree new TreeNode(new TreeNode(new TreeNode(4),2,null),1,new TreeNode(new TreeNode(5),3,n…

Lua使用三目运算符取值

按照三目运算符的规则&#xff0c;lua的三目运算符可以写成&#xff1a;a and b or c b为false时&#xff0c;三目运算符是无效的。 提示&#xff1a;0在lua里也是真&#xff0c;condition and 0 or 1 这句代码没问题 如果你确认b为真&#xff0c;那么就用a and b or c&…

maven私服搭建详细教程

1、为什么需要私服 如果在公司中多个项目模块中的的公共类用的都是一样的&#xff0c;那么不可能将这些一样的代码写两遍。所以将其中一个项目中的代码打包成私服&#xff0c;然后在另外一个模块中去进行引用。 除此之外&#xff0c;如果大公司中开发人员较多&#xff0c;大家同…

什么是多模态学习?

1、定义与概念 多模态学习是一种机器学习方法&#xff0c;它利用多种不同的数据模态来训练模型&#xff0c;这些模态可能包括文本、图像、音频、视频等。多模态AI技术融合了多种数据模式&#xff0c;如文本、图片、视频和音频&#xff0c;以提供对场景的更透彻理解。这种技术的…

《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)

安装 注意 ElementPlus 的 Icon 图标 要额外安装插件 element-plus/icons-vue. npm install element-plus/icons-vue注册 全局注册 定义一个文件 element-icon.js &#xff0c;注意代码第 6 行。加上了前缀 ElIcon &#xff0c;避免组件命名重复&#xff0c;且易于理解为 e…

Java开发从入门到精通(七):Java的面向对象编程OOP:常用API

Java大数据开发和安全开发 &#xff08;一&#xff09;Java的常用API1.1 Object类1.1 toString1.1 equals方法1.1 对象克隆clone1.1 Objects类1.1 包装类1.1 StringBuilder1.1 StringBuffer1.1 StringJoiner1.1 Math、System、Runtime1.1 BigDecimal1.1 传统时间&#xff1a;Da…

TinTin Web3 动态精选:以太坊坎昆升级利好 Layer2,比特币减半进入倒计时

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…

【每日力扣】235. 二叉搜索树的最近公共祖先与39. 组合总和问题描述

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义…

硬件工程师入门基础知识(零)心法篇

硬件工程师入门基础知识(零)心法篇 1.为什么要当硬件工程师?2.什么是硬件工程师?3.怎么成为合格的硬件工程师?4.优秀的硬件工程师需要具备什么技能和品质?5.硬件工程师的成长路径?6.硬件工程师还有哪些职业可能?1.为什么要当硬件工程师? 很多快要毕业或者刚毕业的同学…

int与integer的区别

int和integer都是用来表示整数的数据类型&#xff0c;但有一些细微的区别。 int是Java中的基本数据类型&#xff0c;它可以存储整数值。int类型在内存中占4个字节&#xff0c;范围为-2,147,483,648到2,147,483,647。int类型使用最频繁&#xff0c;因为它的存储空间较小&#x…

【2024年5月备考新增】《软考真题分章练习 - 5 项目进度管理(高项)》

1、( ) is a technique for estimating the duration or cost of an activity or a project using historical data from a similar activity or project. A.Analogous estimating B. parametric estimating C.Three-Point estimating D. Bottom estimating 2、下图中(单位:…

如何本地搭建hMailServer邮件服务

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

Android中使用intent可以传递哪些类型的数据?

Intent可以传递的数据类型基本上分为四种; (1)基本数据类型(包括int,char,string等类型的数据); //传递String intent.putExtra("key_str","传递简单基础的数据");//获取 str = intent.getStringExtra("key_str"); (2)Bundle类型 …