一.快速排序
function quickSort(array, left, right) {
if (left < right) {
var x = array[right], i = left - 1, temp;
for (var j = left; j <= right; j++) {
if (array[j] <= x) {
i++;
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
quickSort(array, left, i - 1);
quickSort(array, i + 1, right);
}
return array;
}
var arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48];
console.log(quickSort(arr, 0, arr.length - 1));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50]
二.两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
var twoSum = function(nums, target) {
let i = nums.length;
while(i > 1) {
let last = nums.pop();
if (nums.indexOf(target - last) > -1) {
return [nums.indexOf(target - last), nums.length]
}
i--
}
};
三.最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。
var longestCommonPrefix = function(strs) {
if(strs.length == 0)
return "";
let ans = strs[0];
for(let i =1;i<strs.length;i++) {
let j=0;
for(;j<ans.length && j < strs[i].length;j++) {
if(ans[j] != strs[i][j])
break;
}
ans = ans.substr(0, j);
if(ans === "")
return ans;
}
return ans;
};
四.三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。
const threeSum = (nums) => {
nums.sort((a, b) => a - b); // 排序
const res = [];
for (let i = 0; i < nums.length - 2; i++) { // 外层遍历
let n1 = nums[i];
if (n1 > 0) break; // 如果已经爆0,不用做了,break
if (i - 1 >= 0 && n1 == nums[i - 1]) continue; // 遍历到重复的数,跳过
let left = i + 1; // 左指针
let right = nums.length - 1; // 右指针
while (left < right) {
let n2 = nums[left], n3 = nums[right];
if (n1 + n2 + n3 === 0) { // 三数和=0,加入解集res
res.push([n1, n2, n3]);
while (left < right && nums[left] == n2) left++; // 直到指向不一样的数
while (left < right && nums[right] == n3) right--; // 直到指向不一样的数
} else if (n1 + n2 + n3 < 0) { // 三数和小于0,则左指针右移
left++;
} else { // 三数和大于0,则右指针左移
right--;
}
}
}
return res;
};
五.无重复字符最长字串
var lengthOfLongestSubstring = function (s) {
const map = {};
let l = 0,
r = 0,
max = 0;
while (r < s.length) {
const pos = map[s[r]];
// 如果 s[r] 曾在 [l, r] 滑动窗口中出现
// 就收缩滑动窗口左侧,把 l 指针移动到 s[r] 上次出现的位置 + 1
if (pos >= l && pos <= r) l = pos + 1;
// 更新 s[r] 出现的位置
map[s[r]] = r;
// 计算滑动窗口大小
max = Math.max(max, r - l + 1);
// 滑动窗口继续右移扩张
r++;
}
return max;
};
六.最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
var longestPalindrome = function(s) {
let result = s[0] ;
for (let i = 0; i < s.length; i++) {
for (let j = 1; j <= 2; j++) { //偶数奇数回文串
let left = i, right = i + j;
while(left >= 0 && right < s.length && s[left] === s[right]) {
left--, right++; //向外扩展直到两端不相同
};
let length = right - left - 1; //(right - 1) - (left + 1) + 1
if (length > result.length) {
result = s.substr(left + 1, length);
}
}
}
return result;
};
七.回文数
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
function isPalindrome (x) {
var str=x.toString();
if((str.split('').reverse().join(''))===str){
return true;
}else{
return false;
}
};
八.罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
var romanToInt = function(s) {
let o = {
'I':1,
'V':5,
'X':10,
'L':50,
'C':100,
'D':500,
'M':1000
},
n = 0;
for(let i=0,len=s.length; i<len; i++){
const temp = o[s[i]]
if( i < len - 1 && temp < o[s[i+1]] ){
n -= temp
}else{
n += temp
}
}
return n
};
JavaScript常见算法问题汇总
博客围绕JavaScript算法展开,涵盖快速排序、两数之和、最长公共前缀、三数之和等多个算法问题。介绍了各问题的描述,如在数组中找和为目标值的两数下标、判断数组中是否存在和为0的三元组等。
1718

被折叠的 条评论
为什么被折叠?



