LeetCode #43字符串相乘
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字符串相乘相关推荐
- leetcode -43 -字符串相乘 -java版
文章目录 题目 代码 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = &quo ...
- LeetCode 43. 字符串相乘【c++/java详细题解】
目录 1.题目 2.思路 3.c++代码 4.java代码 1.题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...
- LeetCode 43字符串相乘44通配符匹配
原创公众号:bigsai,回复进群加入力扣打卡群. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形 ...
- LeetCode 43. 字符串相乘(大数乘法)
文章目录 1. 题目 2. 小学竖式乘法 2.1 普通版 2.2 优化版 1. 题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示 ...
- C++ ,leetcode 43. 字符串相乘 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式
一.思路: 字符串逆序,然后遍历两个逆序后的字符串,然后对应的字符相乘,i+j等于它的位数. string multiply(string num1, string num2) {reverseStr ...
- leetcode 43. 字符串相乘(Multiply Strings)
目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1 ...
- 多写写 leetcode 43. 字符串相乘
难度:中等 频次:55 题目: 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 注意:不能使用任何内置的 BigInt ...
- leetcode 43.字符串相乘
题目 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. 示例 1: 输入: num1 = "2", ...
- 【Day24】 LeetCode算法题 (注释详细+解题思路)[43. 字符串相乘 ] [1800. 最大升序子数组和]
刷题打卡,第 二十四 天 题目一.43. 字符串相乘 题目二.1800. 最大升序子数组和 题目一.43. 字符串相乘 原题链接:43. 字符串相乘 题目描述: 给定两个以字符串形式表示的非负整数 n ...
最新文章
- android中的常用方法,android开发中常用方法总结
- Mybatis Plus——[Could not set property 'id' of '***' with value]解决方案
- 怎么作非线性拟合_值得收藏ansys非线性收敛总结
- RxSwift之UI控件UISwitch与UISegmentedControl扩展的使用
- html转移字符标签,使用标签对HTML特殊字符进行转义
- 全面取消校园全封闭管理!这个省发通知了!那北京呢?
- 如何识别图片中的文字
- Dell Chromebook11 刷Ubuntu
- Spring Boot返回的数据格式是XML 而不是JSON之原因探求的和解决
- 使用ros3d.js实现web 端3D建图
- pivot sqlserver 条件_SqlServer行转列(PIVOT),列转行(UNPIVOT)总结
- ArcGIS for Android 100.3.0(1):开发环境配置
- 10个程序员可以接私活的平台和一些建议
- 网络安全笔记-99-渗透-渗透测试方法论
- html页面导出文件大小,【实战】通过 JS 将 HTML 导出为 PDF 文档
- 【转】Java中斜杠和反斜杠的替换
- JavaScript中的表格:文本域
- css3 滤镜效果(黑白滤镜、模糊化处理等)
- fla文件中切记不能使用TLF文本
- 智慧高速建设的探索与思考【附PPT】
热门文章
- 通过sharepoint 客户脚本,验证列表添加页面上的时间
- Linux Bash Shell编程快速入门
- Dynamics AX 2012–HR-离职
- 解决mysql锁表终极方法
- PHP程序员最易犯10种错误
- Docker Compose 简介、安装、初步体验
- ACM常用C++模板 包括常用头文件
- C#LeetCode刷题之#434-字符串中的单词数​​​​​​​(Number of Segments in a String)
- C#LeetCode刷题之#350-两个数组的交集 II(Intersection of Two Arrays II)
- 通用职责分配软件原则之4-高内聚原则