算法杂记(二)

98 阅读2分钟

「这是我参与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)
    }
};