LeetCode算法题记录——JavaScript

本文提供了解决几个经典编程问题的方法,包括寻找两数之和、判断回文数、转换罗马数字为整数以及查找字符串数组的最长公共前缀。通过不同算法思路的对比,帮助读者理解如何高效地解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 两数之和

// 双重for循环
// var twoSum = function (nums, target) {
//     for (var i = 0; i < nums.length; i++) {
//         for (var n = 0; n < nums.length; n++) {
//             if (nums[i] + nums[n] === target) {
//                 if (i === n) continue
//                 return [i, n]
//             }
//         }
//     }
// }

// 利用数组模拟哈希结构
// var twoSum = function (nums, target) {
//     let res = []
//     for (var i = 0; i < nums.length; i++) {
//         if (res.indexOf(nums[i]) !== -1) {
//             return [res.indexOf(nums[i]), i]
//         }
//         res.push(target - nums[i])
//     }
// }

// 利用哈希结构(最优解)
var twoSum = function (nums, target) {
    var map = new Map()
    for (var i = 0; i < nums.length; i++) {
        if (map.has(nums[i])) {
            return [map.get(nums[i]), i]
        }
        map.set(target - nums[i], i)
    }
}
console.log(twoSum([3, 2, 4], 6)) // [1,2]
console.log(twoSum([3, 3], 6)) // [0,1]

2. 回文数

var isPalindrome = function (x) {
    return x + '' === x.toString().split('').reverse().join('')
};
console.log(isPalindrome(121)) // true

3. 罗马数字转整数

// 1. 判断一般情况和特殊情况然后将其对应的整数相加
// var romanToInt = function (s) {
//     let roman = { I: 1, IV: 4, V: 5, IX: 9, X: 10, XL: 40, L: 50, XC: 90, C: 100, CD: 400, D: 500, CM: 900, M: 1000 }
//     let value = 0
//     for (var i = 0; i < s.length; i++) {
//         if (roman[s[i]] >= roman[s[i + 1]]) { // 判断前一个罗马数字代表的整数是否大于后一个
//             value += roman[s[i]] // 是 将罗马数字对应的整数直接相加
//         } else {
//             if (i === s.length - 1) { // 如果i=s.length-1 说明已经是最后一个罗马数字
//                 value += roman[s[i]]
//                 break
//             }
//             value += roman[s[i] + s[i + 1]] // i!==s.length-1 就相加前一位和后一位的罗马数字组合所代表的整数
//             i += 1
//         }
//     }
//     return value
// };

// 2. 优先先处理特殊情况 
// var romanToInt = function (s) {
//     let roman = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000, a: 4, b: 9, c: 40, d: 90, e: 400, f: 900 }

//     s = s.replace('IV', 'a')
//     s = s.replace('IX', 'b')
//     s = s.replace('XL', 'c')
//     s = s.replace('XC', 'd')
//     s = s.replace('CD', 'e')
//     s = s.replace('CM', 'f')

//     let value = 0
//     for (var i = 0; i < s.length; i++) {
//         value += roman[s[i]]
//     }
//     return value

// };

// 3.用switch代替对象存储
// function getValue (value) {
//     switch (value) {
//         case 'I': return 1
//         case 'V': return 5
//         case 'X': return 10
//         case 'L': return 50
//         case 'C': return 100
//         case 'D': return 500
//         case 'M': return 1000
//         case 'a': return 4
//         case 'b': return 9
//         case 'c': return 40
//         case 'd': return 90
//         case 'e': return 400
//         case 'f': return 900
//         default: return 0
//     }
// }
// var romanToInt = function (s) {
//     s = s.replace('IV', 'a')
//     s = s.replace('IX', 'b')
//     s = s.replace('XL', 'c')
//     s = s.replace('XC', 'd')
//     s = s.replace('CD', 'e')
//     s = s.replace('CM', 'f')

//     let value = 0
//     for (var i = 0; i < s.length; i++) {
//         value += getValue(s[i])
//     }
//     return value
// };

// 4.根据本质判断  把小值放在大值左边就做减法,否则做加法
function getValue (value) {
    switch (value) {
        case 'I': return 1
        case 'V': return 5
        case 'X': return 10
        case 'L': return 50
        case 'C': return 100
        case 'D': return 500
        case 'M': return 1000
        default: return 0
    }
}
var romanToInt = function (s) {
    let value = 0
    for (var i = 0; i < s.length; i++) {
        if (getValue(s[i]) >= getValue(s[i + 1])) {
            value += getValue(s[i])
        } else {
            value -= getValue(s[i])
        }
    }
    return value
};
console.log(romanToInt('MCMXCIV')) // 1994
console.log(romanToInt('LVIII')) // 58

4.最长公共前缀 

/*  纵向分析 判断每一列的值是否都相等
1. 取数组第一个值的第一个字母
2. 判断数组其余选项第一个值是否相等 相等进入下一个循环 不相等 返回最后一次相等时的位置之前的字母

3. 取数组第一个值的第两个字母
4. 判断其余选项前第二个值是否相等 相等继续往下判断 不相等 返回最后一次相等时的位置之前的字母
5. ...
*/
var longestCommonPrefix = function (strs) {
    if (strs === null || strs.length === 0) return ''
    for (var i = 0; i < strs[0].length; i++) {
        for (var n = 1; n < strs.length; n++) {
            if (i === strs[n].length || strs[n][i] !== strs[0][i]) {
                return strs[0].substring(0, i)
            }
        }
    }
    return strs[0]
};
console.log(longestCommonPrefix(["flower", "flow", "flight"]))  // f1
console.log(longestCommonPrefix(["dog", "racecar", "car"])) // ''
console.log(longestCommonPrefix([''])) // ''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值