Python技术迷

最近的行情,回暖了。。。

最近网上冲浪的时候,一网友发帖:“听人说今年找工作行情开始好了?”我感觉已经看到几个人都这么说了,难道真的回暖了?

Image

但是评论区的画风却不一样。有的小伙伴一本正经:“是的,机会多多,建议亲先裸辞再找呢”你小子,害人不浅。

Image

无独有偶,又有小伙伴出来反串了:“行情太好了,一个一个都跑出国外啦”好好好,我信你个鬼。

Image

还有老实人开玩笑:“是的,我拿了两个offer并且都已入职。白天顺丰,晚上滴滴。”灵活就业是吧,想上班就上班。

Image

最后,还有一位朋友也是:“我就是那个{听人}”行,出门在外,身份是自己给的。

Image

看了一圈下来,大部分是串子,只有很少的人说行情好转。看来{听人}不可信啊,行情还是那样。

Image

但是,陆陆续续有人说回暖了,也许,行情是真的在一点点变好。那么你们怎么觉得呢?

下面是今日的大厂算法题
现在环境就这样,不管是大厂还是小厂,笔面试都会问到算法,所以算法无疑是非常重要的。下面是今日算法题,来自LeetCode的第43题:字符串相乘,下面是我的算法思路及实现,让我们来看看吧。
算法题目

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的库函数,如 BigInt。

专属福利 
👉点击领取:最全Python资料合集
算法思路

字符串相乘的基本思想可以借鉴传统的纸笔计算方法:即从右到左,逐位相乘,然后将各位的结果累加。关键点在于处理每一位相乘后的进位以及最后的累加。

  1. 创建一个长度为 num1.length + num2.length 的数组 result,用于存储乘法的每一位结果。

  2. 遍历 num1 和 num2 的每一位,将每一位的乘积加到 result 的对应位置。

  3. 处理进位:从左到右遍历 result,将超过 10 的部分向前一位进位。

  4. 将 result 转换为字符串,注意去除前导零。

代码实现

Java实现

public class Solution {    public String multiply(String num1, String num2) {        if (num1.equals("0") || num2.equals("0")) return "0";        int[] result = new int[num1.length() + num2.length()];        for (int i = num1.length() - 1; i >= 0; i--) {            for (int j = num2.length() - 1; j >= 0; j--) {                int mul = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');                int sum = mul + result[i + j + 1];                result[i + j + 1] = sum % 10;                result[i + j] += sum / 10;            }        }        StringBuilder sb = new StringBuilder();        for (int p : result) if (!(sb.length() == 0 && p == 0)) sb.append(p);        return sb.toString();    }}
JavaScript实现
function multiply(num1, num2) {  if (num1 === "0" || num2 === "0") return "0";  let result = new Array(num1.length + num2.length).fill(0);  for (let i = num1.length - 1; i >= 0; i--) {    for (let j = num2.length - 1; j >= 0; j--) {      const mul = (num1[i] - '0') * (num2[j] - '0');      const sum = mul + result[i + j + 1];      result[i + j + 1] = sum % 10;      result[i + j] += Math.floor(sum / 10);    }  }  if (result[0] === 0) result.shift();  return result.join('');}
Go实现
package main
import ( "strings")
func multiply(num1 string, num2 string) string { if num1 == "0" || num2 == "0" { return "0" }
result := make([]int, len(num1)+len(num2)) for i := len(num1) - 1; i >= 0; i-- { for j := len(num2) - 1; j >= 0; j-- { mul := int(num1[i]-'0') * int(num2[j]-'0') sum := mul + result[i+j+1] result[i+j+1] = sum % 10 result[i+j] += sum / 10 } } resultStr := strings.Builder{} for i, v := range result { if !(i == 0 && v == 0) { resultStr.WriteString(string(rune(v + '0'))) } }
return resultStr.String()}

算法解析

此算法的时间复杂度为O(n×m),其中n和m分别是 num1 和 num2 的长度,因为我们需要对两个字符串的每一位进行相乘操作。空间复杂度为O(n+m),用于存储乘法结果的数组。
示例和测试

以 num1 = "123" 和 num2 = "456" 为例,按照上述算法步骤执行,可以得到结果 "56088"。

测试代码可以根据上述实现直接运行,以验证算法的正确性。

总结
字符串相乘是一种基础且常见的算法问题,它要求我们不依赖于语言内置的大数处理能力,自己实现基本的数学运算。
Image
 1
Image
热门推荐

Image