Algorithms—43.Multiply Strings

本文详细阐述了如何使用字符串实现两个整数相乘的方法,包括初始化数组、遍历乘法过程、累加和进位处理等关键步骤,提供了一个高效且易于理解的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:按照乘法的定义,逐位相乘。

public class Solution {
    public String multiply(String num1, String num2) {
        if (num1.equals("0")||num2.equals("0")) {
			return "0";
		}
    	if (num1.length()<num2.length()) {
			return multiply(num2,num1);
		}
    	int l1=num1.length();
        int[] n1=new int[l1];
        for (int i = 0; i <l1; i++) {
			n1[l1-i-1]=Integer.parseInt(num1.substring(i, i+1));
		}
        int l2=num2.length();
        int[] n2=new int[l1];
        for (int i = 0; i <l2; i++) {
			n2[l2-i-1]=Integer.parseInt(num2.substring(i, i+1));
		}
        int[] a=new int[l1+l2-1];
    	int sum=0;
    	int carry=0;
		for (int i = 0; i < a.length; i++) {
			// 每一位乘级相加的结果
			for (int j = Math.max(0,i-l2+1); j <= Math.min(i,l1-1); j++) {
				sum += n1[j] * n2[i-j];
			}
			// 加进位
			sum += carry;
			carry = sum / 10;
			sum%=10;
			a[i]=sum;
			sum = 0;
		}
		StringBuffer sb=new StringBuffer();
		if (carry!=0) {
			sb.append(String.valueOf(carry));
		}
    	for (int i = a.length-1; i >=0 ; i--) {
			sb.append(String.valueOf(a[i]));
		}
    	return sb.toString();
    }
}


耗时:368ms,中下游。


### algorithms.eaSimple 参数详解 `algorithms.eaSimple` 是 DEAP 框架中用于实现简单遗传算法的一个函数。以下是该函数各参数的具体含义及其用法: #### 函数签名 ```python resultPop, logbook = algorithms.eaSimple( pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=200, stats=None, halloffame=None, verbose=True ) ``` --- #### 参数说明 1. **pop**: 表示初始种群(population)。这是一个由个体组成的列表,其中每个个体是一个基因型表示的对象。通常通过 `toolbox.population()` 方法生成[^2]。 2. **toolbox**: 这是一个工具箱对象,包含了定义算法所需的各种操作符(如交叉、变异、评估等)。这些操作符可以通过注册到 `base.Toolbox` 中完成配置。例如: ```python from deap import base, creator toolbox = base.Toolbox() toolbox.register("evaluate", evaluate_function) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutFlipBit, indpb=0.05) ``` 3. **cxpb (Crossover Probability)**: 定义了两个父代个体之间发生交叉的概率。取值范围为 `[0, 1]`,默认值为 `0.5`。较高的概率会增加种群多样性[^2]。 4. **mutpb (Mutation Probability)**: 定义了一个个体发生变异的概率。同样取值范围为 `[0, 1]`,默认值为 `0.2`。较低的突变率有助于保持解的质量,而较高则可以探索更多可能性[^2]。 5. **ngen (Number of Generations)**: 遗传算法运行的最大迭代次数(即世代数),默认值为 `200`。此参数决定了算法终止的时间点。 6. **stats (Statistics Object)**: 可选参数,用于记录每一代统计信息的对象。如果提供,则会在日志中显示诸如平均适应度、标准差等指标。创建方式如下: ```python from deap import tools stats = tools.Statistics(key=lambda ind: ind.fitness.values) stats.register("avg", numpy.mean) stats.register("std", numpy.std) stats.register("min", numpy.min) stats.register("max", numpy.max) ``` 7. **halloffame (HallOfFame Object)**: 可选参数,用于存储历史最优解集合的对象。它可以保存一定数量的最佳个体以便后续分析或输出。 8. **verbose (Verbosity Level)**: 控制是否打印每一代的日志信息,默认值为 `True`。当设置为 `False` 时,不会有任何控制台输出[^2]。 --- #### 返回值 - **resultPop**: 经过指定代数演化后的最终种群。 - **logbook**: 记录了整个演化进程的数据结构,包含每一代的相关统计数据(如果有启用 `stats` 和 `verbose` 的话)。 --- #### 使用示例 以下是一个完整的例子展示如何调用 `eaSimple` 并观察其行为: ```python import random from deap import base, creator, tools, algorithms # 创建适配器类 creator.create("FitnessMax", base.Fitness, weights=(1.0,)) creator.create("Individual", list, fitness=creator.FitnessMax) # 初始化工具箱 toolbox = base.Toolbox() # 属性生成器 toolbox.register("attr_bool", random.randint, 0, 1) # 结构初始化器 toolbox.register("individual", tools.initRepeat, creator.Individual, toolbox.attr_bool, 100) toolbox.register("population", tools.initRepeat, list, toolbox.individual) # 注册评价函数 def evalOneMax(individual): return sum(individual), toolbox.register("evaluate", evalOneMax) toolbox.register("mate", tools.cxTwoPoint) toolbox.register("mutate", tools.mutFlipBit, indpb=0.05) toolbox.register("select", tools.selTournament, tournsize=3) # 设置其他参数 pop = toolbox.population(n=300) hof = tools.HallOfFame(1) stats = tools.Statistics(lambda ind: ind.fitness.values) stats.register("avg", lambda values: sum(values) / len(values)) stats.register("min", min) stats.register("max", max) # 执行 eaSimple 算法 result_pop, logbook = algorithms.eaSimple( pop, toolbox, cxpb=0.5, mutpb=0.2, ngen=40, stats=stats, halloffame=hof, verbose=True ) print(f"Best individual is {hof[0]} with a fitness value of {hof[0].fitness.values}") ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值