尽可能的全面正确的解析一个任意 url 的所有参数为 Object,注意边界条件的处理。
let url =
'http://www.domain.com/?user=�admin&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled';
parseParam(url);
/* 要求输出结果
{
user: 'anonymous',
id: [ 123, 456 ], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
city: '北京', // 中文需解码
enabled: true, // 未指定值得 key 约定为 true
}
*/
String.prototype.trim = function(char, type) {
if (char) {
if (type == 'left') {
return this.replace(new RegExp('^\\' + char + '+', 'g'), '');
} else if (type == 'right') {
return this.replace(new RegExp('\\' + char + '+$', 'g'), '');
}
return this.replace(
new RegExp('^\\' + char + '+|\\' + char + '+$', 'g'),
''
);
}
return this.replace(/^\s+|\s+$/g, '');
};
// 去除字符串首尾的全部空白
var str = ' Ruchee ';
console.log('xxx' + str.trim() + 'xxx'); // xxxRucheexxx
// 去除字符串左侧空白
str = ' Ruchee ';
console.log('xxx' + str.trim(' ', 'left') + 'xxx'); // xxxRuchee xxx
// 去除字符串右侧空白
str = ' Ruchee ';
console.log('xxx' + str.trim(' ', 'right') + 'xxx'); // xxx Rucheexxx
// 去除字符串两侧指定字符
str = '/Ruchee/';
console.log(str.trim('/')); // Ruchee
// 去除字符串左侧指定字符
str = '/Ruchee/';
console.log(str.trim('/', 'left')); // Ruchee/
// 去除字符串右侧指定字符
str = '/Ruchee/';
console.log(str.trim('/', 'right')); // /Ruchee
/*
* 方法一
* @return boolean
*/
function checkPalindrom(str) {
return (
str ==
str
.split('')
.reverse()
.join('')
);
}
console.log(checkPalindrom('abccba')); // true
console.log(checkPalindrom('abcdecba')); // false
/*
* 方法二
* @return boolean
*/
function checkPalindrom(str) {
let newStr = '';
for (let i = str.length - 1; i >= 0; i--) {
newStr += str[i];
}
console.log(newStr === str);
}
checkPalindrom('abccba'); // true
checkPalindrom('abcdecba'); // false
输入: [1, 13, 24, 11, 11, 14, 1, 2];
输出: [1, 13, 24, 11, 14, 2];
function unique(arr) {
let newArray = [];
let obj = {};
for (let i = 0; i < arr.length; i++) {
if (!obj[arr[i]]) {
obj[arr[i]] = true;
newArray.push(arr[i]);
}
}
return newArray;
}
输入:absadaaaa
输出 : a, 6
function computedStr (str) {
let charObj = {}
for (let i = 0; i < str.length; i++) {
if (!charObj[str[i]]) {
charObj[str[i]] = 1
} else {
charObj[str[i]] += 1
}
}
let maxCharStr = ''
let maxCount = 0
console.log(charObj)
for (let i in charObj) {
if (charObj[i] > maxCount) {
maxCharStr = i
maxCount = charObj[i]
}
}
return maxCharStr + ',' + maxCount
}
console.log(computedStr('abaaaasdad')) // a,6
输入: aaabbbccdddd
输入: {a: 3, b: 3, c: 2, d: 4}
var strs = 'aaabbbccdddd'
var result = str.split('').reduce((acc, curValue) => {
acc[curValue]++ || (acc[curValue] = 1)
return acc
}, {})
// 或者想装逼可以这么写
var strs = 'aaabbbccdddd'
var result = str
.split('')
.reduce((acc, curValue) => (acc[curValue]++ || (acc[curValue] = 1), acc), {})
console.log(result) // {a: 3, b: 3, c: 2, d: 4}
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
var maxSubArray = function(nums) {
let max = nums[0]
let sum = nums[0]
for (let i = 1; i < nums.length; i++) {
if (sum + nums[i] > nums[i]) { // 如果 -2 + 1 > 1
sum = sum + nums[i]
} else {
sum = nums[i]
}
max = Math.max(max, sum)
}
return max
}
let nums = [-2,1,-3,4,-1,2,1,-5,4]
console.log(maxSubArray(nums))
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。
输入: [3,0,1]
输出: 2
输入: [9,6,4,2,3,5,7,0,1]
输出: 8
思路一
- 对nums做排序,从i=0的位置开始遍历数组
- 如果i+1位置的元素减去i位置的元素为1,则i后移
- 否则循环停止,最后返回i位置的元素加1即所需的返回值
var missingNumber = function (nums) {
for (let i = 0; i < nums.length; i++) {
for (let j = 0; j < nums.length-i-1; j++) {
if (nums[j] > nums[j+1]) {
let temp = nums[j+1]
nums[j+1] = nums[j]
nums[j] = temp
}
}
}
if (nums[0] != 0) {
return 0;
}
let res = null
for (let q = 0; q < nums.length-1; q++) {
if (nums[q+1] - nums[q] == 1) {
continue
} else {
res = nums[q]+1
break
}
}
return res
}
思路二 (较好)
- 用等差数列求和的方式算出前n个数的和
- 然后依次减去数组中的每一个数,最后剩下的就是缺失的数值
var missingNumber = function (nums) {
let n = nums.length+1
let sum = n * (n-1) / 2
for (let i = 0; i < nums.length; i++) {
sum = sum - nums[i]
}
return sum
}
思路三
- 新建一个长度为n的数组arr都是0,然后依次遍历一遍nums
- 把相应位置的0变成1,然后遍历一下arr看看哪个地方还是0,那么这个地方的下表对应的数就是缺失的数值了