题目:

Given two numbers represented as strings, return multiplication of the numbers as a string.

Note: The numbers can be arbitrarily large and are non-negative.

给两个用字符串表示的数字,求它们的乘积。

注意:数字非负,且可以无限大

————————————————————————

之前未考虑数字可以无限大的情况,采用的方法是 将字符串转化为数字,然后相乘,将乘积再次转化为字符串 输出,

最后发现只能通过一部分的测试用例,对于超过long类型表示范围的数字,无法通过。

-----------------------------------------------------

方法思想:根据乘法的演算过程

------------------------------------------

代码:(在牛客网上可以ac,但是leetcode有个用例过不去,超时问题)

public class Solution {
public String multiply(String num1, String num2){
if(num1.equals("0")|| num2.equals("0"))
return "0";
if(num1.charAt(0) == '-' || num2.charAt(0) == '-')
return "false";
int len_num1,len_num2;
len_num1 = num1.length();
len_num2 = num2.length();
String [] sing_mul = new String[len_num2];
int maxLen_sing = 0;
for(int z=0; z<len_num2; z++) //初始化
sing_mul[z] = ""; int times = 0;
//被乘数*乘数 --> 返回是字符串数组sing_mul,每一个元素是某个乘数位*被乘数的结果。
for(int i=len_num2-1; i>=0; i--){
int num2Cur = Integer.parseInt(String.valueOf(num2.charAt(i))); //乘数的某一位
int add = 0;
String temp = "";
//某个乘数位*被乘数 ---> 返回是一个字符串
for(int j=len_num1-1; j>=0; j--){ //遍历被乘数的每一位
int num1Cur = Integer.parseInt(String.valueOf(num1.charAt(j)));
int mulCur = num1Cur * num2Cur + add;
temp += String.valueOf(mulCur%10);
add = mulCur/10;
}
if(add != 0){
temp += String.valueOf(add);
}
StringBuffer sb_temp = new StringBuffer(temp);
StringBuffer temp_rev = sb_temp.reverse();
String str_temp ;
str_temp = temp_rev.toString();
//末尾补充"0";
for (int z=0; z<times; z++)
str_temp += "0";
sing_mul[i] = str_temp;
times ++; //maxLen_sing --> 字符串数组sing_mul中元素的最大长度
if(sing_mul[i].length()>maxLen_sing)
maxLen_sing = sing_mul[i].length();
} //将字符串数组中的所有元素相加。
String result = sing_mul[0];
for(int z=1; z<len_num2; z++){
int len_res = result.length();
//给短的字符串前补充"0".
if(sing_mul[z].length()<len_res){ //字符串前部进行填充
//先反转字符串,补"0",再次反转字符串。
StringBuffer sb_z = new StringBuffer(sing_mul[z]);
String sb_z_str = sb_z.reverse().toString();
for(int w=0; w<(len_res-sing_mul[z].length());w++)
sb_z_str += "0";
StringBuffer sb_temp = new StringBuffer(sb_z_str);
sing_mul[z] = sb_temp.reverse().toString();
}
int add_ = 0;
String temp_str = "";
for(int i=len_res-1; i>=0; i--){
int n1 = Integer.parseInt(String.valueOf(result.charAt(i)));
int n2 = Integer.parseInt(String.valueOf(sing_mul[z].charAt(i)));
int tep = n1+n2+add_;
add_ = tep/10;
temp_str += tep%10;
}
if(add_ != 0){
temp_str += String.valueOf(add_);
}
StringBuffer sb_temp_str = new StringBuffer(temp_str);
result = sb_temp_str.reverse().toString();
}
return result;
}
public static void main(String [] args){
Solution mulStr = new Solution();
String result = mulStr.multiply("9133","0");
System.out.print(result);
}
}

代码解释:

1. num1为被乘数,num2为乘数,用乘数的每一位去乘被乘数,得到一个字符串---》最终会得到字符串数组sig_mul,其中包含乘数位数个字符串

(注意:除了最后一个乘数位,其余的乘数位和被乘数相等得到的字符串应该在末尾补充相应位数的“0”)

2. sig_mul[0]中的字符串是最长的,因此result = sig_mul[0]

3. 每次使用result和sig_mul中的元素相加(1<=i<sig_mul.length)

(注意:每次相加之后的位数都会变化,但是以result的位数为准,因为它始终表示最长的位数)

(注意:每次使用sig_mul中的元素和result相加时,当sig_mul[i]的位数<result的位数时,应该给sig_mul[i]前补充相应位数的“0”,从而使得两个相加的字符串的位数相等,可以进行相加

4. 在这个过程中会频繁的用到字符串reverse。

(因为每次相加或者相乘都是从字符串的末尾开始的,而正确的字符串应该是相乘或者相加结果的反转的字符串)

文中转化的方式是 String  转化 StringBuffer --》利用StringBuffer.reverse() --》StringBuffer 转化String

-----------------------------------------

部分问题未解决,后面更新。

[leetcode]multiply-strings java代码的更多相关文章

  1. LeetCode: Multiply Strings. Java

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  2. LeetCode: Multiply Strings 解题报告

    Multiply StringsGiven two numbers represented as strings, return multiplication of the numbers as a ...

  3. [LeetCode] Multiply Strings 字符串相乘

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  4. [leetcode]Multiply Strings @ Python

    原题地址:https://oj.leetcode.com/problems/multiply-strings/ 题意: Given two numbers represented as strings ...

  5. 43. Multiply Strings (JAVA)

    Given two non-negative integers num1 and num2represented as strings, return the product of num1 and  ...

  6. LeetCode:Multiply Strings

    题目链接 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...

  7. [Leetcode] Multiply strings 字符串对应数字相乘

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  8. leetcode面试准备:Multiply Strings

    1 题目 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...

  9. [LeetCode] 415 Add Strings && 67 Add Binary && 43 Multiply Strings

    这些题目是高精度加法和高精度乘法相关的,复习了一下就做了,没想到难住自己的是C++里面string的用法. 原题地址: 415 Add Strings:https://leetcode.com/pro ...

  10. LeetCode解题报告—— Combination Sum & Combination Sum II & Multiply Strings

    1. Combination Sum Given a set of candidate numbers (C) (without duplicates) and a target number (T) ...

随机推荐

  1. string类型的常用方法

    1. 在尾部插入/删除元素 string s("hello"); // 插入/删除一个字符 s.push_back('!'); s.pop_back(); // 插入多个字符 s. ...

  2. 2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段

    2017-2018-2 1723 『Java程序设计』课程 结对编程练习-四则运算-最后阶段 最后的一周,时间越来越紧张,因为之前的拖沓和一些事情的耽误,导致了如今的紧张,这一周应该是我们小组效率最高 ...

  3. do...while和while...do的两种场景比较

    场景:脚本每5分钟执行一次,从数据库中每次查询1000数据进行处理,直到处理结束.两种用while和do...while两种方式实现的伪代码如下: 1. while...do $count = mys ...

  4. jsp九大内置对象之config 和 out

    jsp中config的作用是读取web.xml中的配置信息,一般在后台获取初始化的参数,jsp页面用的较少因为jsp属于表现层,一般是获取数据. jsp中的out对象是将内容放到缓冲区中然后显示出来

  5. “吃神么,买神么”的第一个Sprint计划(第五天)

    “吃神么,买神么”项目Sprint计划 ——5.25  星期一(第五天)立会内容与进度 摘要:logo2出来了,修改过不一样的风格,组内总体评价可以,但是颜色要改,色调没注意,统一决定改成与背景色一致 ...

  6. 【硬件】- 英特尔CPU命名中的产品线后缀

    产品线后缀是CPU命名体系里最复杂最难懂的,在英特尔冗长的产品线中,CPU的后缀也是千变万化.不带后缀的CPU一般就是最普通的桌面级处理器,不管是性能还是价格都比较中庸,比如当前性价比较高的Core  ...

  7. 深入探索.NET内部了解CLR如何创建运行时对象

    前言 SystemDomain, SharedDomain, and DefaultDomain. 对象布局和内存细节. 方法表布局. 方法分派(Method dispatching). 因为公共语言 ...

  8. Thread start()方法和run()方法的区别

    转自:http://www.cnblogs.com/skywang12345/p/3479083.html start():作用一个新的线程,新线程会执行相应的run()方法,start()不能被重复 ...

  9. 【Linux笔记】linux crontab实现自动化任务

    在服务器中我们经常需要定时自动让程序自动进行数据备份.程序备份.执行某个进程等等操作,在linux服务器一般使用crontab实现,而windows下使用计划任务实现,crontab是linux系统下 ...

  10. git 常用命令(含删除文件)

    git 常用命令(含删除文件) Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库: ...