快排
- 快排思想:在數據集之中,選擇一個元素作為"基準"(pivot)。
所有小于"基準"的元素,都移到"基準"的左邊;所有大于"基準"的元素,都移到"基準"的右邊。
對"基準"左邊和右邊的兩個子集,不斷重復第一步和第二步,直到所有子集只剩下一個元素為止。 - 如何選樞紐:
在當前數組中隨機一個
在當前數組的第一個元素,中間的元素,最后的元素中挑大小居中的那一個。
這樣就可以有效避免每次都挑一個最小(大)的元素了
var quickSort = function(arr) {
if (arr.length <= 1) { return arr; }
var pivotIndex = Math.floor(arr.length / 2);
var pivot = arr.splice(pivotIndex, 1)[0];
var left = [];
var right = [];
for (var i = 0; i < arr.length; i++){
if (arr[i] < pivot) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([pivot], quickSort(right));
};
回文串判斷
- 如果一個字符串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那么這個字符串就是palindrome(回文)
function palindrome(str){
var reg = /[W_]/g;
var lowerStr=str.toLowerCase().replace(reg,function(res){
return "";
});
if(lowerStr.length===0){
return true;
}
if(lowerStr[0]!==lowerStr[lowerStr.length-1]){
return false;
}else{
return palindrome(lowerStr.slice(1,lowerStr.length-1));
}
}
var str="aabbAA";
console.log(palindrome(str));
翻轉字符串算法
function reverseString(str){
var tmp="";
for(var i=str.length-1;i>=0;i--){
tmp+=str.charAt(i);
}
return tmp;
}
var str="aaahhhgggss";
console.log(reverseString(str));
展平數組
- es10 flat(1)展開一層,flat(2)展開兩層
[1,[2,3,[4,5]],[3,4,[4,5,[3,4]]]].flat(2)
- es6(some+...)
function faltten(arr){
while(arr.some(item=>Array.isArray(item))){
arr=[].concat(...arr);
}
return arr;
}
console.log(faltten([2,3,[3,4,[5,5,5]]]));
- ...展開一層
[].concat(...[2,3,[3,4,[5,5,5]],[2,[3,4,[5,6]]]]
- reduce+concat
function faltten(arr){
return arr.reduce((pre,now)=>{
return pre.concat(Array.isArray(now)?faltten(now):now);
},[])
}
reduce實現map
-
map() 方法返回一個新數組,數組中的元素為原始數組元素調用函數處理后的值。
map() 方法按照原始數組元素順序依次處理元素。
注意: map() 不會對空數組進行檢測。
注意: map() 不會改變原始數組。
array.map(function(currentValue,index,arr), thisValue)
thisValue:對象作為該執行回調時使用,傳遞給函數,用作 "this" 的值。如果省略了 thisValue,或者傳入 null、undefined,那么回調函數的 this 為全局對象。(如果用箭頭函數則綁定無效)
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
Array.prototype.fakeMap=function(fn,context){
if(typeof fn!=="function"){
throw new TypeError( fn+"is not a function");
}
let arr = this;
if(!Array.isArray(arr)){
throw new TypeError('list must be a Array');
}
if(arr.length==0){
return [];
}
return arr.reduce((total,value,index)=>{
total.push(fn.call(context,value,index,arr));
return total;
},[])
}
let arr = [1,2,3];
let obj={a:1}
// let newarr=arr.fakeMap((item, index, arr) => item+1);
let mya=arr.fakeMap(function(){
console.log(this.a)
},obj);
// console.log(newarr);
字符串中出現最多次的字符
var str="asjfhsdhdkghdnmjhsafjhsf";
function findMaxCount(str){
var obj={};
for(let i=0;i<str.length;i++){
if(obj[str.charAt(i)]){
obj[str.charAt(i)]++;
}else{
obj[str.charAt(i)]=1;
}
}
let num=0;
let char="";
for(var key in obj){
if(obj[key]>num){
num=obj[key];
char=key;
}
}
console.log("出現最多次數的是:"+char+",出現了:"+num+"次")
}
findMaxCount(str);
有多個is,怎么把is只剩一個
var str="hhishhisisishhh";
function deleteIs(str){
var flag=true;
tmp=str.replace(/is/g,function(item){
if(flag){
flag=false;
return item;
}else{
return "";
}
})
console.log(tmp);
}
deleteIs(str);