「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
字符串相加
解法一
取巧法:
将字符串转成整数相加,哈哈哈,不过会由于精度问题出错
var addStrings = function(num1, num2) {
return (parseInt(num1) + parseInt(num2)).toString()
};
解法二
模拟相加:
根小学算数列公式一样,相加,满十进一
var addStrings = function(num1, num2) {
let i = num1.length-1
let j = num2.length-1
let add = 0
let ans = []
while(i >= 0 || j >=0 || add!==0 ){
let x = i >= 0 ? num1[i] : 0
let y = j >= 0 ? num2[j] : 0
let res = parseInt(x) + parseInt(y) + add
ans.push(res % 10)
add = res - 10 >= 0 ? 1 : 0
j--
i--
}
return ans.reverse().join('')
};
还是说一下上述的思路吧,用i来记录第一个数的位数的索引,j来记录第二个数的位数的索引,add表示有无要进一的。循环判断条件,前两个后好理解,就是数读取完了,而add不为0则表示要再进一位,比如55+45,x和y是当前的位数,如果当前有就为该位数,没有则置为0,然后就是同位数相加并加有无进一的数,然后推进结果数组中,然后指针都前移。最后再将结果数组反转并转成字符串即可。
比较版本号
解法一
split:
首先将两个版本号根据.切割成两个数组,然后再分别用两个指针来遍历两个数组,进行比较,如果版本号1比较短,那么只要看版本号2后面是不是全是0就可以啦,如果不是就是返回-1,如果是的话两个版本号其实是相等的。反过来也是这个道理。后面的就是常规的比较啦,v1[i] < v2[j]就返回-1,v1[i] > v2[j]就返回1。在循环里比较不出结果就只能说明两个版本号是相等的。
var compareVersion = function(version1, version2) {
let v1 = version1.split('.')
let v2 = version2.split('.')
let i = 0
let j = 0
while(i < v1.length || j < v2.length){
if((i >= v1.length && parseInt(v2[j])) || (parseInt(v1[i]) < parseInt(v2[j]))){
return -1
}
if((j >= v2.length && parseInt(v1[i])) || (parseInt(v1[i]) > parseInt(v2[j]))){
return 1
}
i++
j++
}
return 0
};
两数之和
解法一
暴力法不解释:
var twoSum = function(nums, target) {
for(let i = 0 ; i < nums.length ; i++){
for(let j = i + 1; j < nums.length; j++){
if(nums[i] + nums[j] === target){
return [i , j]
}
}
}
};
解法二
哈希表:
var twoSum = function(nums, target) {
let map = new Map()
for(let i = 0; i < nums.length; i++){
if(map.has(target - nums[i])){
return [map.get(target - nums[i]),i]
}
map.set(nums[i],i)
}
};