function lengthOfLongestSubstring(s) {
let num = 0, obj = {}, left = 0;
if (!s) return 0
if (s.length === 1) return 1
for (let right = 0; right < s.length; right++) {
// 有重复的或索引为0
if (obj[s[right]] || obj[s[right]] == 0) {
// 有重复的但是是在左游标之前
if (obj[s[right]] < left) {
obj[s[right]] = right
console.log('true')
} else {
left = obj[s[right]] + 1
obj[s[right]] = right
console.log('false')
}
} else {
// 无重复添加对应值
obj[s[right]] = right
console.log(left, right, obj, num)
}
num = Math.max(num, right - left + 1)
}
return num
}
4.罗马数字转换为整数
罗马数字只包括I - M
思路:罗马数字计数从左往右依次相加,累加器 num,计数并返回,对象obj保存字母对应的数值
判断当前位是否为: I | X | C , 有三种情况: 一.(I 为 V | X ) ; 二.(X 后可为 L | C); 三.(C 后可为 D | M)
function romanToInt(s) {
let obj = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
},
num = 0;
for (let i = 0; i < s.length; i++) {
if (s[i] == 'I') {
if (s[i + 1] == 'V' || s[i + 1] == 'X') {
num += obj[s[i + 1]] - obj[s[i]];
i += 1
continue;
} else {
num += obj[s[i]];
}
} else if (s[i] == 'X') {
if (s[i + 1] == 'L' || s[i + 1] == 'C') {
num += obj[s[i + 1]] - obj[s[i]];
i += 1
continue;
} else {
num += obj[s[i]];
}
} else if (s[i] == 'C') {
if (s[i + 1] == 'D' || s[i + 1] == 'M') {
num += obj[s[i + 1]] - obj[s[i]];
i += 1
continue;
} else {
num += obj[s[i]];
}
} else {
num += obj[s[i]]
}
}
return num;
};
5.判断数字是否为回文数
回文数:形如12321,逆转后相等
思路1:变成字符串,第一位与最后一位比较,如果第一位为符号直接为false
function isPalindrome(x) {
var y = x + '',
last = y.length - 1;
for (let i = 0; i < Math.floor(y.length / 2); i++) {
if (y[i] * 1 === NaN) {
console.log('有符号')
return false
}
if (!(y[i] == y[last])) {
console.log('不是回文', [[y[i], y[last]]])
return false
}
last -= 1;
}
return true
};
思路2:不用字符串实现:翻转数字与原数字比较
变量:reverse 为逆转后的数字 , rem 位数
翻转方法:( x / rem) % 10 获取当前待翻转位数值,将之前已翻转部分乘10后相加
x > x % rem)时循环
function isPalindrome(x) {
if (x < 0) {
return false
}
let reverseX = 0,
log = 0,
rem = 1;
while (x > x % rem) {
reverseX = reverseX * 10 + (Math.floor(x / rem) % 10)
console.log(reverseX, rem, (Math.floor(x / rem) % 10))
rem *= 10
}
return x == reverseX ? true : false;
}
6.Z字形变换
输入:'12345678',3
输出:15246837
1 5
2 4 6 8
3 7
思路:控制方向记录每行的内容,当行数等于参数或等于1(不是第一次)时变换方向
三个变量,obj保存每行的内容 {行数:内容}
turn为方向
row为行数
function convert(s, numRows) {
let obj = {},
turn = 1, // 1为向下
row = '1',
reObj = '';
if (numRows == 1) return s
for (let i = 0; i < s.length; i++) {
if (!obj[row]) {
obj[row] = s[i]
} else {
obj[row] += s[i]
}
if (row == numRows || (row == 1 && typeof (row) != 'string')) {
turn *= -1;
}
row *= 1;
row += turn
}
for (const prop in obj) {
reObj += obj[prop]
}
return obj
};
7.寻找两个有序数组的中位数
输入:[1,2,3] , [2,3,4]
输出:2.5
思路: 拼接数组,排序,如果数组长度为偶数取中间两数的平均值,为奇数则直接返回
用到的方法:array.concat() array.sort()
sort方法可以接受一个函数作为参数,通过函数的返回值来控制升序或降序,升序:sort(function(a,b){return a - b})