【JavaScript】js常见算法问题

字符串相关

  1. 判断一个单词是否是回文字符串
function test(str){
  return str.split("").reverse().join("")===str
}
var str = "12212"
console.log(test(str))

  1. 在句子中反转词
function test(str){
  var temp = str.split(" ").map(function(item){
    return item.split("").reverse().join("");})
  return temp.join(" ")
}
var str = "I love you "
console.log(test(str))
  1. 统计字符串中出现最多的字符
function findMaxChar(str){
	var hashTable = {}
	var temp = 0
	for(let i in str){
		if(!hashTable[str.charAt(i)]){
			hashTable[str.charAt(i)] = 1
		}else{
			hashTable[str.charAt(i)] += 1
		}
	}
	//比较
	for(let i in hashTable){
		if(hashTable[i]>=temp){
			temp = i
		}
	}
	//返回最大字符
	return temp
}
  1. 删除字符串中重复的字符
  2. 在n和m之间生成随机整数(左闭右开)
Math.floor(Math.random()*(m-n) + n)
  1. 随机生成指定长度的字符串
function getRandStr(n){
	var str = 'abcdefghijklmnopqrstuvwxyz9876543210'
	var i = 0
	var res=''
	while(i<n){
		res += str.charAt(Math.floor(Math.random()*str.length))
		i++
	}
	return res
}
  1. 将一段英文句子的每个单词首字母大写
  2. RegExp对象的方法:
  • reg.exec(str)
  • reg.test(str) 返回布尔值
  • reg.compile(new_reg)
  1. String对象的正则方法
  • str.replace(reg,callBack)
  • str.match(reg)
  • str.search(reg)
  • str.split(reg)
//方法一'i love you'
function upSent(sentence){
	var sent = sentence.split(' ').map((elem,index)=>{
		return elem.slice(0,1).toUpperCase()+elem.slice(1)
	})
	return sent.join(' ')
}
//方法二
function upSent(sentence){
//\w匹配非空格字母数字下划线,g代表全局模式
	return sentence.replace(/\w+/g,function(word){
		return word.slice(0,1).toUpperCase() + word.slice(1)
	})
}

数组相关

  1. 去掉数组中重复的值(数组的indexOf方法)
//第一种方法
function unique1(arr){
	var res = []
	for(let i=0;i<arr.length;i++){
		//indexOf,O要大写
		if(res.indexOf(arr[i])=="-1"){
			res.push(arr[i])
		}
	}
	return res;
}
//第二种方法,
function unique2(arr){
	var res = []
	var hashTable = {}
	for(let i=0;i<arr.length;i++){
		if(!hashTable[arr[i]]){
			hashTable[arr[i]] = true
			res.push[arr[i]]
		}
	}
	return res
}
  1. 实现一个方法找出一个数组中重复的元素
function findElem(arr){
	arr = arr.sort();
	var res = [];
	for(let i=0;i<arr.length;i++){
		if(arr[i+1] != arr[i]){
			continue;
		}else{
			res.push(arr[i])
			i++;
		}
		}
	return res
}
  1. 生成具有n个范围在rangeL到rangeR之间元素的随机数组
function randArr(n,rangeL,rangeR){
	if(rangeR<rangeL)return "rangeR need greater than rangeL"
	var arr = []
	for(let i=0;i<n;i++){
		arr.push(Math.random()*(rangeR-rangeL) + rangeL)
	}
	return arr
}

排序算法

  1. 冒泡排序
function bubbleSort(arr){
	var len = arr.length
	var temp = 0
	for(let i=0;i<len;i++){
		for(let j=0;j<len-i;j++){
			if(arr[j]>arr[j+1]){
				temp = arr[j+1]
				arr[j+1] = arr[j]
				arr[j] = temp
			}
		}
	}
	return arr
}
  1. 选择排序
function selectionSort(arr) {
        var len = arr.length;
        var minIndex, temp;
        for (var i = 0; i < len - 1; i++) {
            minIndex = i;
            for (var j = i + 1; j < len; j++) {
                if (arr[j] < arr[minIndex]) {     //寻找最小的数
                    minIndex = j;                 //将最小数的索引保存
                }
            }
            temp = arr[i];
            arr[i] = arr[minIndex];
            arr[minIndex] = temp;
        }
        return arr;
    }
     selectionSort([3,5,2,8,9,7,6])
  1. 插入排序
function insetrSort(arr){
	var len = arr.length
	var Idx,temp
	for(let i=1;i<len;i++){
		for(let j=i;j>0;j--){
			if(arr[j]<arr[j-1]){
              temp = arr[j-1]
              arr[j-1] = arr[j]
              arr[j] = temp
            }
		}    
	}
	return arr
}

递归

  1. 获取长度为n斐波那契数列(黄金分割数列)
function getFib(n){
	var fibarr = []
	var i = 0
	while(i<n){
		if(i<=1){fibarr.push(i)}
		else{fibarr.push(fibarr[i-1]+fibarr[i-2])}
		i++
	}
	return fibarr
}
  1. 获取斐波那契数列第n个值
function getfib(n){
	if(n>1){
		return getfib(n-1)+getfib(n-2)
	}else{return n}
}

3.给定一个已排序的数组和一个值val,将这个值插入数组,要求数组维持有序,返回插入位置,要求二分算法
比如:[1,3,5,7] val=2 输出1 ;[1,2,4,5] val=4 输出2

function findIdx(arr,val){
  
  var len = arr.length;
  var index;
  var mid = parseInt(len/2);
  
  //退出条件
  if(len ===0){
    console.log("hi")
    index = 0
    return index
  }
  if(len === 1){
    val<arr[0]? index= 0 : index=1;
    return index;
  }
  //递归条件
  if(val == arr[mid]){
    return mid;
  }
  else if(val<arr[mid]){
    index = findIdx(arr.slice(0,mid),val);
  }
  else{
    index =mid;
    index += findIdx(arr.slice(mid),val);
    
  }
  return index;
}

数据结构

  1. js实现二叉树
class Node{
	constructor(data,left,right){
		this.data = data;
		this.left = left;
		this.right = right;
	}
}
class BinarySearchTree{
	constructor(){
		this.root=null;
	}
	insert(data){
		let n = new Node(data,null,null)
		//如果没有根节点,让插入的元素变成根节点
		if(!this.root){
			return this.root = n;
		}
		let currentNode = this.root;
		let parent = null;
		while(true){
			parentNode = currentNode
			if(data<currentNode.data){
				currentNode = currentNode.left;
				//如果当前节点指向null,让当前节点指向n
				if(currentNode === null){parentNode = n;break}
			}else{
				currentNode = currentNode.right;
				//如果当前节点指向null,让当前节点指向n
				if(currentNode === null){parentNode = n;break}
			}
		}
		
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值