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

在说大数相乘问题之前,我们先来看一下在算法竞赛中使用起来非常方便快捷的C++模板类vector

1. 不定长数组vector

C语言在声明和定义一个数组时,必须要事先指定数组的长度,这就不利于数组中元素的动态增长,而C++引入了不定长数组vector,就能很好的解决这个问题,这也是vector受到广大acm竞赛选手青睐的原因所在。

vector是一个标准模板类,所以需要用vector A 或 vector B来声明一个vector,vector声明一个整数数组,而vector声明一个字符串数组。

vector各种操作

  • vector a :定义一个int型向量a
  • vector a(10):定义一个初始化大小为10的int型向量a
  • a.size():读取大小
  • a.push_back(i):向尾部添加元素i
  • a.pop_back():删除最后一个元素
  • a.resize():改变大小
  • a.clear():清空vector
  • a.empty():判断是否为空
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	vector<int> a;
	int x = 1, y = 2, z = 3; 
	a.push_back(x);
	a.push_back(y);
	a.push_back(z);
    
	for (int i = 0; i < a.size(); i++) {
		cout << a[i] << ' ';
	}
	cout << endl;
	a.pop_back();
	cout << a.size() << endl;
	for (int i = 0; i < a.size(); i++) {
		cout << a[i] << ' ';
	}
	return 0;
}

Attention
特别需要说明的是vector中的begin()函数和end()函数,这两个函数在使用sort进行排序时经常会用到。
begin()和end()返回的是一个迭代器,而这里的迭代器类似于一个指向vector中元素的指针。begin()指向vector中的第一个元素,end()指向vector中最后一个元素的下一个位置。
于是会有下面这样的用法:

int main()
{
	vector<int> A;
	A.push_back(9);
	A.push_back(1);
	A.push_back(0);
	A.push_back(8);
	A.push_back(4);
	for (int i = 0; i < A.size(); i++) {
		cout << A[i] << ' ';
	} //A=[9,1,0,8,4]
	cout << endl;

	sort(A.begin(), A.end()); //从小到大排序
	for (int i = 0; i < A.size(); i++) {
		cout << A[i] << ' ';
	} //A=[0,1,4,8,9]
	return 0;
}

补充:
对于一般的vector,如果在定义时没有指定它的初始化大小,例如 vector < int > A,则只能通过push_back的方式向vector中添加元素;但如果声明定义了一个指定初始化大小的vector,例如这样vector< int > A(10),则除了使用push_back,还可以直接通过A[0]=1这样的方式初始vector A中的元素。

2. 字符串相乘(大数相乘)

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

示例1
输入: num1 = “2”, num2 = “3”
输出: “6”

示例2
输入: num1 = “123”, num2 = “456”
输出: “56088”

说明
num1 和 num2 的长度小于110。
num1 和 num2 只包含数字 0-9。
num1 和 num2 均不以零开头,除非是数字 0 本身。
不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/multiply-strings

小常识:一个m位整数和一个n位整数相乘,得到的乘积位数最大为(m+n)

代码如下:

class Solution {
public:
	vector<int> mul(vector<int> &A, vector<int> &B) {
		vector<int> C(A.size() + B.size(), 0);  //初始化C向量,长度为A、B长度之和,每个元素的值均为0

		int i, j;
		for (j = 0; j < B.size(); j++) {
			for (i = 0; i < A.size(); i++) {
				C[i + j] += A[i] * B[j]; // C存放乘积
			}
		}

		//处理进位
		int extra = 0;
		for (i = 0; i < C.size(); i++) {
			extra += C[i];
			C[i] = extra % 10;
			extra = extra / 10;
		}

		//去0(乘积的真实结果可能没有6位 或者 一个非零数与零相乘,所以要把最高位的0去掉)
		while (C.size() > 1 && C.back() == 0)   //若只有一个0则无需去0
			C.pop_back();

		return C;
	}
	

	string multiply(string num1, string num2) {
		// 例如 num1="123",num2="456"
		vector<int> A;
		vector<int> B;
		int i;


		//倒着存储字符串中的每个数字,方便计算
		for (i = num1.size() - 1; i >= 0; i--)
			A.push_back(num1[i] - '0');  // A=[3,2,1]
		for (i = num2.size() - 1; i >= 0; i--)
			B.push_back(num2[i] - '0');  // B=[6,5,4]

		vector<int> C = mul(A, B);
		string str = "";
		for (i = C.size() - 1; i >= 0; i--)
			str += to_string(C[i]);

		return str; 
	}
};

好久没写代码了,手都生疏了,太不容易了,在Leetcode上提交了4次才通过,呜呜呜以后一定勤奋撸代码,葱丫!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用reverse函数反转leetcode字符串的方法是:将字符串作为参数传入reverse函数,然后将反转后的字符串返回给调用者。例如:let reversedString = reverse("leetcode")。 ### 回答2: 要使用reverse函数反转leetcode这个字符串,可以使用以下步骤: 1. 将字符串"leetcode"转换为字符数组。可以使用字符串的toCharArray()方法,该方法会返回一个字符数组,其中每个元素是字符串的一个字符。 2. 定义两个指针,left和right,分别指向字符数组的首尾。 3. 循环交换left和right指向的字符,然后将left指针向右移动一位,将right指针向左移动一位,直到left指针大于等于right指针。 4. 将反转后的字符数组转换回字符串。可以使用字符数组的valueOf()方法,该方法会将字符数组转换为一个新的字符串。 以下是用Java代码实现上述步骤的示例: ```java public String reverseString(String s) { // 将字符串转换为字符数组 char[] chars = s.toCharArray(); // 定义两个指针 int left = 0; int right = chars.length - 1; // 循环交换字符 while (left < right) { char temp = chars[left]; chars[left] = chars[right]; chars[right] = temp; left++; right--; } // 将字符数组转换为字符串 return String.valueOf(chars); } ``` 通过调用reverseString("leetcode")函数,将会返回字符串"edocteel",即将"leetcode"反转的结果。 ### 回答3: 要使用reverse函数来反转字符串"leetcode",只需将字符串转换为一个列表,然后使用reverse函数来翻转该列表,最后将列表转回字符串即可。 首先,将字符串"leetcode"转换为一个字符列表,可以使用list函数来实现,即list("leetcode"),得到列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']。 接下来,使用reverse函数来反转该列表,即reverse(['l', 'e', 'e', 't', 'c', 'o', 'd', 'e'])。 最后,将翻转后的列表转换回字符串,可以使用join函数将列表中的字符连接起来,即''.join(['e', 'd', 'o', 'c', 't', 'e', 'e', 'l'])。 所以,将字符列表['l', 'e', 'e', 't', 'c', 'o', 'd', 'e']翻转并转换为字符串的过程为:''.join(reverse(list("leetcode"))),得到的结果为"edocteel",即字符串"leetcode"反转后的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值