一天一大 lee(克隆图)难度:中等-Day20200813
时间:2022-07-25
本文章向大家介绍一天一大 lee(克隆图)难度:中等-Day20200813,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目:
给定两个以字符串形式表示的非负整数 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 本身。
- 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
- 不能使用任何标准库的大数类型(比如 BigInteger)或直接将输入转换为整数来处理。
抛砖引玉
抛砖引玉
思路
- 模拟乘法运算,逐位与另外字符逐位相乘
- 存放乘积及两个数组的索引位置
- 按索引位累加
实现
- 声明 dp 记录位的乘积,长度为两数长度之和
- num1 长 n,索引 i;num2 长 n,索引 j
- dp[i+j+1] = num1[i]*num2[j]
- 累加:
- 有进位:dp[i+j] = dp[i+j]+进位值
- 无进位:则不变
- 注意:dp[i+j+1]的前一位是 dp[i+j]
特殊情况
- 两数任意为 0,结果为 0
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = function (num1, num2) {
if (num1 === '0' || num2 === '0') return '0'
let n = num1.length,
m = num2.length
dp = new Array(n + m).fill(0)
for (let i = n - 1; i >= 0; i--) {
for (let j = m - 1; j >= 0; j--) {
// dp[i+j+1] 包含上一轮该乘积
let sum = dp[i + j + 1] + parseInt(num1[i] * num2[j], 10)
// 当前位i+j+1
dp[i + j + 1] = parseInt(sum % 10, 10)
// 上一位
dp[i + j] = dp[i + j] + parseInt(sum / 10, 10)
}
}
return dp.join('').replace(/^0*/, '')
}
做加法
- 上面是逻辑是统一相乘,然后按存储位相加
- 更直观的是从一个数字中取出一个元素与另外一个字符每一位相乘然后得到的字符每次累加
- 字符串累加刚好又是几天前刚做的热乎的直接复用了字符串相加
/**
* @param {string} num1
* @param {string} num2
* @return {string}
*/
var multiply = function (num1, num2) {
if (num1 === '0' || num2 === '0') return '0'
let n = num1.length,
m = num2.length,
_result = '0'
for (let i = m - 1; i >= 0; i--) {
let dp = [],
jin = 0
for (let j = m - 1; j > i; j--) {
// 已处理位填充0
dp.push(0)
}
for (let j = n - 1; j >= 0; j--) {
// 单个位乘积
let sum = parseInt(num2[i] * num1[j], 10) + jin
dp.push(parseInt(sum % 10, 10))
// 进位
jin = parseInt(sum / 10, 10)
}
// 剩余进位
if (jin) {
dp.push(parseInt(jin % 10, 10))
}
// 累加
_result = addStrings(_result, dp.reverse().join(''))
}
return _result
// 字符串累加
function addStrings(a, b) {
let i = a.length - 1,
j = b.length - 1,
jin = 0,
wei = 0,
result = ''
while (i >= 0 || j >= 0 || jin != 0) {
const x = i >= 0 ? a.charAt(i) - '0' : 0
const y = j >= 0 ? b.charAt(j) - '0' : 0
wei = x + y + jin
result = (wei % 10).toString() + result
jin = parseInt(wei / 10, 10)
i -= 1
j -= 1
}
return result
}
}
- Sass 基础(五)
- [信息安全] 1.密码工具箱
- [解读REST] 2.REST用来干什么的?
- [解读REST] 5.Web的需求 & 推导REST
- [解读REST] 1.REST的起源
- [解读REST] 3.基于网络应用的架构
- [解读REST] 4.基于网络应用的架构风格
- [解读REST] 6.REST的应用经验以及教训
- [认证授权] 6.Permission Based Access Control
- [认证授权] 5.OIDC(OpenId Connect)身份认证授权(扩展部分)
- [认证授权] 4.OIDC(OpenId Connect)身份认证授权(核心部分)
- [OIDC in Action] 1. 基于OIDC(OpenID Connect)的SSO
- [OIDC in Action] 2. 基于OIDC(OpenID Connect)的SSO(纯JS客户端)
- [认证授权] 2.OAuth2授权(续) & JWT(JSON Web Token)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Pandas tricks 之 transform的用法
- Springboot + RabbitMQ 用了消息确认机制,感觉掉坑里了!
- 一款功能简约到可怜的SQL 客户端!
- 震惊!ConcurrentHashMap里面也有死循环,作者留的“彩蛋”?
- Python GUI项目实战(六)实现添加学生信息的功能
- 打卡群刷题总结0816——三角形最小路径和
- 打卡群刷题总结0814——二叉树展开为链表
- 打卡群刷题总结0813——二叉树展开为链表
- 打卡群刷题总结0812——路径总和 II
- SQL中CASE表达式的妙用
- 2w 字 + 40 张图带你参透并发编程!
- RSA 敏感数据加解密方案
- 极客算法训练笔记(一),算法学习方法篇
- 链表:听说用虚拟头节点会方便很多?
- 从JVM设计者的角度来看.class文件结构,一文弄懂.class文件的身份地位