leetcode:43. Multiply Strings 大数相乘

题目描述:

Given two non-negative integers num1 and num2 represented as strings, return the product of num1and num2, also represented as a string.

Example 1:

Input: num1 = "2", num2 = "3"
Output: "6"

Example 2:

Input: num1 = "123", num2 = "456"
Output: "56088"

Note:

  1. The length of both num1 and num2 is < 110.
  2. Both num1 and num2 contain only digits 0-9.
  3. Both num1 and num2 do not contain any leading zero, except the number 0 itself.
  4. You must not use any built-in BigInteger library or convert the inputs to integer directly.

解题思路:

1.两数相乘后的结果一定一定小于两数的长度之和;

2.计算过程:从右向左,将数2中的每一位的数与数1相乘,最后将结果相加。

计算过程:

Multiplication

可以得到,对于num[i] *num[j](数1中的第i位数字与数2中的第j位数字相乘的结果只会存放在第【i+j】和【i+j+1】这两位上)

同牛客网https://www.nowcoder.com/questionTerminal/0f0badf5f2204a6bb968b0955a82779e

实现:

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String num1=sc.next().toString();
        String num2=sc.next().toString();
        String ret=fun(num1,num2);
        System.out.println(ret);
    }
    public static String fun(String num1, String num2) {
		int m=num1.length(),n=num2.length();
		int[] pos=new int[m+n];
		for (int i = m-1; i >=0; i--) {
			for (int j =n-1; j>=0; j--) {
				int mul=(num1.charAt(i)-'0')*(num2.charAt(j)-'0');
				int p1=i+j,p2=i+j+1;
				int sum=mul+pos[p2];
				pos[p1]+=sum/10;//高位
				pos[p2]=(sum)%10;//低位
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int p:pos){
			if (!(sb.length() == 0 && p == 0)) {//筛掉首位为0的情况
                sb.append(p);
            }
		}
		return sb.length()==0?"0":sb.toString();
	    }
}

 

给定一个整数数组 nums 和一个目标值 target,要求在数组中找出两个数的和等于目标值,并返回这两个数的索引。 思路1:暴力法 最简单的思路是使用两层循环遍历数组的所有组合,判断两个数的和是否等于目标值。如果等于目标值,则返回这两个数的索引。 此方法的时间复杂度为O(n^2),空间复杂度为O(1)。 思路2:哈希表 为了优化时间复杂度,可以使用哈希表来存储数组中的元素和对应的索引。遍历数组,对于每个元素nums[i],我们可以通过计算target - nums[i]的值,查找哈希表中是否存在这个差值。 如果存在,则说明找到了两个数的和等于目标值,返回它们的索引。如果不存在,将当前元素nums[i]和它的索引存入哈希表中。 此方法的时间复杂度为O(n),空间复杂度为O(n)。 思路3:双指针 如果数组已经排序,可以使用双指针的方法来求解。假设数组从小到大排序,定义左指针left指向数组的第一个元素,右指针right指向数组的最后一个元素。 如果当前两个指针指向的数的和等于目标值,则返回它们的索引。如果和小于目标值,则将左指针右移一位,使得和增大;如果和大于目标值,则将右指针左移一位,使得和减小。 继续移动指针,直到找到两个数的和等于目标值或者左指针超过了右指针。 此方法的时间复杂度为O(nlogn),空间复杂度为O(1)。 以上三种方法都可以解决问题,选择合适的方法取决于具体的应用场景和要求。如果数组规模较小并且不需要考虑额外的空间使用,则暴力法是最简单的方法。如果数组较大或者需要优化时间复杂度,则哈希表或双指针方法更合适。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值