由于某书竟然限制每天发文章数!每天限制两篇!所以在这儿留下自己的笔记,督促自己每天的学习。
这题目给的很简单 就是简单的两字符串之乘 但是难度为
4kyu上来也没管,直接写代码,感觉很简单嘛
function multiply(a, b) {
console.log(a * b)
return (a * b) + ''
}
结果发现,但是当数字足够大时 发现结果不会全部展示 而是会用 +e 来显示
害我以为很简单 只能另寻思路 暴力解法 类似做一个数学题,依次相乘,已经想到了 性能可能会极差 复杂度高 先看看能否实现
// 1 2 3
// * 1 2 4
// -----------
// 1 2 i = 2, j = 2
// 6 i = 2, j = 1
// -----------
// 7 2 i = 2, j = 1
// 以此类推
// ...
// 0 1 5 2 5 2
// 索引
// 0 1 2 3 4 5 一共6个数字 乘积的结果 最大不可能超过6位数
// 上代码
function multiply(a, b) {
if(a == 0 || b == 0) return '0'
// 创建一个空数组,来放置各个位置的值
var arr = [];
// 第一层循环 倒循环 先计算最后一个值
for (var i = a.length - 1; i >= 0; i--) {
for (var j = b.length - 1; j >= 0; j--) {
// 索引的值 + 1,当前值所在位置
var bigIndex = i + j + 1;
// i + j 当前值 之前 的一个值的位置
var smallIndex = i + j;
// 两数相乘(这里是很小的数相乘) 如果之前数组中 已经存在乘积 则需要加上 看上面的分解 此时的 bigIndex 则是上次的 smallIndex
var multi = a[i] * b[j] + (arr[bigIndex] || 0);
// 直接取余 取个位的数值
arr[bigIndex] = multi % 10;
// 乘积除以10 看需不需要进 1 ,再加上原来的值不存在的话就为0
arr[smallIndex] = Math.floor(multi / 10) + (arr[smallIndex] || 0)
}
}
// console.log(arr.join('').replace(/^0+/,''))
return arr.join('').replace(/^0+/,'')
}
到目前为止,已经实现了功能。但我觉得还是可以继续改进,这样做的复杂度高。继续研究,
未完待续~