1.背景知识

1.1 String,StringBuffer,StringConstructor

String类是不可变类。StringBuffer和StringConstructor是可变类,字符串内的字符可以被修改。
StringBuffer是线程安全的,使用了Synchronized关键词,加了线程锁。
StringConstructor不是线程安全的,所以效率比StringBuffer稍高。
StringBuffer和StringConstructor两者功能类似。
具体详见 https://blog.csdn.net/csxypr/article/details/92378336

1.2 竖式乘法以及优化竖式乘法

1.2.1 普通竖式乘法


普通竖式乘法的思想十分的简单:遍历num2的每一个数字与num1相乘,将结果补零后进行加和,实际上是字符串的相加问题。

1.2.2 优化竖式乘法


优化竖式乘法:在本质上也是一种特殊的规律。优化竖式乘法的每一个加项是由一位与一位的乘积得出的,乘积的结果按两位显示(xy或者是0z)。以上图为例:其规则:
5x3=15,放在第一行;5x2=10;放在第二行,左移一位(补零);5x1=05,左移一位。5乘num1的各位完毕。然后对4,再进行如上操作。
创建一个int类型的数组rs。可以发现有如下规律:
num1的第i位乘以num2的第j位的乘积,加上之前的进位,正好位于结果的i+j+1位,即:
rs[i+j+1]=(rs[i+j+1]+num1的第i位*num2的第j位)%10
同时有:进位保存在rs[i+j]中。
rs[i+j]=(rs[i+j+1]+num1的第i位*num2的第j位)/10
由于计算是从i=0;j=0;自底向上进行计算的,所以rs的赋值过程类似于DP动态规划。

2.Java代码实现

2.1 普通竖式乘法

//采用普通竖式乘法的思想
//Version2
//Code By Codefmeister
public class StringMultiple_43_version2 {public static String multiply(String num1,String num2){if(num1.equals("0")||num2.equals("0")){return "0";}else{String rs="0";//num2的每一个数去乘以num1,再加和for(int i=num2.length()-1;i>=0;i--){StringBuilder temp = new StringBuilder();int carry = 0;int currentNum2Bit = num2.charAt(i)-'0';for(int j=0;j<num2.length()-1-i;j++){temp.append('0');}for(int k=num1.length()-1;k>=0||carry!=0;k--){int currentNum1Bit = k<0?0:num1.charAt(k)-'0';char bitRs = (char)(((currentNum1Bit*currentNum2Bit)+carry)%10+'0');carry = (currentNum1Bit*currentNum2Bit+carry)/10;temp.append(bitRs);}rs = addString(rs,temp.reverse().toString());}return rs;}}public static String addString(String num1,String num2){StringBuilder addRs = new StringBuilder();int carry = 0,n=0,m=0;char tempBit;for(int i=num1.length()-1,j=num2.length()-1;i>=0 || j>=0 || carry>0;i--,j--){n = i<0?0 : num1.charAt(i) - '0';m = j<0?0 : num2.charAt(j) - '0';tempBit = (char)((n+m+carry)%10+'0');carry = (n+m+carry)/10;addRs.append(tempBit);}return addRs.reverse().toString();}public static void main(String args[]){String a="9";String b = "9";String rs = "0";rs = multiply(a,b);System.out.println(rs);}}

2.2 优化竖式乘法

//采用优化竖式乘法
//Version3
//Code By Codefmeister
public class StringMultiple_43_version3 {public static String multiply(String num1,String num2){if(num1.equals("0")||num2.equals("0")){return "0";}int num1Bit=0,num2Bit=0,sum=0;int[] rs = new int[num1.length()+num2.length()];for(int i = num1.length()-1;i>=0;i--){num1Bit = num1.charAt(i)-'0';for(int j = num2.length()-1;j>=0;j--){num2Bit = num2.charAt(j)-'0';sum = num1Bit*num2Bit+rs[i+j+1];rs[i+j+1] = sum%10;rs[i+j] = sum/10+rs[i+j];}}StringBuilder StringRs = new StringBuilder();char p;for(int i=0;i<num1.length()+num2.length();i++){p = (char)(rs[i]+'0');if(i==0&&rs[i]==0){continue;}StringRs.append(p);}return StringRs.toString();}public static void main(String args[]){String a="123";String b="456";String rs = multiply(a,b);System.out.println(rs);}}

LeetCode #43字符串相乘相关推荐

  1. leetcode -43 -字符串相乘 -java版

    文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...

  2. LeetCode 43. 字符串相乘【c++/java详细题解】

    目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...

  3. LeetCode 43字符串相乘44通配符匹配

    原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...

  4. LeetCode 43. 字符串相乘(大数乘法)

    文章目录 1. 题目 2. 小学竖式乘法 2.1 普通版 2.2 优化版 1. 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示 ...

  5. C++ ,leetcode 43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式

    一.思路: 字符串逆序,然后遍历两个逆序后的字符串,然后对应的字符相乘,i+j等于它的位数. string multiply(string num1, string num2) {reverseStr ...

  6. leetcode 43. 字符串相乘(Multiply Strings)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1 ...

  7. 多写写 leetcode 43. 字符串相乘

    难度:中等 频次:55 题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 注意:不能使用任何内置的 BigInt ...

  8. leetcode 43.字符串相乘

    题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...

  9. 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]

    刷题打卡,第 二十四 天 题目一.43. 字符串相乘 题目二.1800. 最大升序子数组和 题目一.43. 字符串相乘 原题链接:43. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 n ...

最新文章

  1. android中的常用方法,android开发中常用方法总结
  2. Mybatis Plus——[Could not set property 'id' of '***' with value]解决方案
  3. 怎么作非线性拟合_值得收藏ansys非线性收敛总结
  4. RxSwift之UI控件UISwitch与UISegmentedControl扩展的使用
  5. html转移字符标签,使用标签对HTML特殊字符进行转义
  6. 全面取消校园全封闭管理!这个省发通知了!那北京呢?
  7. 如何识别图片中的文字
  8. Dell Chromebook11 刷Ubuntu
  9. Spring Boot返回的数据格式是XML 而不是JSON之原因探求的和解决
  10. 使用ros3d.js实现web 端3D建图
  11. pivot sqlserver 条件_SqlServer行转列(PIVOT),列转行(UNPIVOT)总结
  12. ArcGIS for Android 100.3.0(1):开发环境配置
  13. 10个程序员可以接私活的平台和一些建议
  14. 网络安全笔记-99-渗透-渗透测试方法论
  15. html页面导出文件大小,【实战】通过 JS 将 HTML 导出为 PDF 文档
  16. 【转】Java中斜杠和反斜杠的替换
  17. JavaScript中的表格:文本域
  18. css3 滤镜效果(黑白滤镜、模糊化处理等)
  19. fla文件中切记不能使用TLF文本
  20. 智慧高速建设的探索与思考【附PPT】

热门文章

  1. 通过sharepoint 客户脚本,验证列表添加页面上的时间
  2. Linux Bash Shell编程快速入门
  3. Dynamics AX 2012–HR-离职
  4. 解决mysql锁表终极方法
  5. PHP程序员最易犯10种错误
  6. Docker Compose 简介、安装、初步体验
  7. ACM常用C++模板 包括常用头文件
  8. C#LeetCode刷题之#434-字符串中的单词数​​​​​​​(Number of Segments in a String)
  9. C#LeetCode刷题之#350-两个数组的交集 II(Intersection of Two Arrays II)
  10. 通用职责分配软件原则之4-高内聚原则