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([''])) // ''