面试中遇到的算法题
1.手搓简单的promise封装ajax
function get(url) {
return new Promise((resolve, reject) => {
var xhr = new XMLHttpRequest();
xhr.open("get", url, true);
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.status == 200 && xhr.readyState == 4) {
resolve(xhr.responseText);
}else{
reject(new Error(xhr.statusText));
}
};
});
}
2.统计字符串中每个字母或者单词出现次数的问题
注意问题:str是字符串也可以是数组。如果是一个长句子或者文章,请利用js将其处理成一个包含所有单词的数组;
function Statistics(str){//缺陷:有兼容性的问题
var n=new Map();
//str=str.toLocaleLowerCase()//如有需要可以将其先全部转化为小写
for(let i=0;i<str.length;i++){
let x= n.get(str[i])
if(x){
x++;
n.set(str[i],x)
}else{
n.set(str[i],1)
}
}
return n
}
function Statistics(str){ //缺点也是兼容性
return str.split('').reduce((pre, item) => {
pre[item] ? pre[item] ++ : pre[item] = 1
return pre;
}, {})
}
3.去重问题
本质上是2种方式:1是利用循环查找相同元素并删除或插入一个新数组,2是利用对象属性不可重复的特性
最简单的es6:
function unrepeat(arr){
return [...new Set(arr)];
// return Array.from(new Set(arr))
}
利用对象重复属性会被覆盖的特性
function unrepeat(arr){
let obj={};
for(let i=0;i<arr.length;i++){
obj[arr[i]]=arr[i];
}
return [...Object.values(obj)];//推荐使用Object,values(),原因Object.keys()取出来是字符串,而Object.values()存的时候是什么类型,取的时候还是什么类型
//let newarr=[];
// for(let val of obj){
// newarr.push(val);
// }
//return newarr;//道理与上面的差不多
}
incloudes方法
function unrepeat(arr){
var array =[];
for(var i = 0; i < arr.length; i++) {
if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值
array.push(arr[i]);
}
}
return array
}
indexof去重
function unrepeat(arr) {
var array = [];
for (var i = 0; i < arr.length; i++) {
if (array.indexOf(arr[i]) === -1) {
array.push(arr[i])
}
}
return array;
}
4.排序问题
sort函数
function order(arr){
return arr.sort((a,b)=>a-b)
}
冒泡排序
function order(arr){
for ( var i=0;i<arr.length-1;i++){
for (var j=0;j<arr.length-1-i;j++) {
if (arr[j] > arr[j + 1]) {
var temp = arr[i];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
return arr;
}
快速排序
function quickSort(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=[];
//比基准小的放在left,比基准大的放在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));
}
插入排序
function insertionSort(arr) {
var len = arr.length;
var preIndex, current;
for (var i = 1; i < len; i++) {
preIndex = i - 1;
current = arr[i];
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex];
preIndex--;
}
arr[preIndex + 1] = current;
}
return arr;
}
5.深拷贝问题
递归
//该代码系转载,已经忘了从哪复制的了
function deepClone(obj){
let objClone = Array.isArray(obj)?[]:{};
if(obj && typeof obj==="object"){
for(key in obj){
if(obj.hasOwnProperty(key)){
//判断ojb子元素是否为对象,如果是,递归复制
if(obj[key]&&typeof obj[key] ==="object"){
objClone[key] = deepClone(obj[key]);
}else{
//如果不是,简单复制
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
JSON对象方式,但是有缺陷:无法拷贝对象里的方法
function deepClone(obj) {
var _obj = JSON.stringify(obj),
objClone = JSON.parse(_obj);
return objClone;
}
jq
var newArray = $.extend(true,[],array); // true为深拷贝,false为浅拷贝
6.数组扁平化问题
递归
//改代码是转载,也是忘了从哪复制的了
function Flat5(arr){
var newArr =[];
for(var i= 0; i < arr.length; i++){
if(arr[i] instanceof Array){
newArr = newArr.concat(Flat5(arr[i]));
// newArr.push.apply(newArr, Flat5(arr[i]));
}else{
newArr.push(arr[i]);
}
}
return newArr;
}
function newarr(arr) {
return arr.reduce((a, b) => {
if (Object.prototype.toString.call(b) == "[object Number]") {
return a.concat(b);
} else {
return a.concat(newarr(b));
}
}, []);
}
7.青蛙跳台阶,有多少种方法的问题。
function Frogjump(n){
let dp=[1,1];
for(let i=2;i<n+1;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
8.某个范围内的随机数
function randomRang2(min, max) {//闭区间
return Math.floor(Math.random()* (max - min + 1) + min);
}
9.除去字符串中的空格
function strtrim(str){
return str.trim();//去除左右两端
//return str.replice(/\s/g,"")//去除全部空格
}
10.将普通数字转人民币形式的数字(例如1234567转成1,234,567)
function rmbnumber(str){
let arr= typeof str=="number"?str.toString().split("").reverse():str.split("").reverse()
for(let i=3;i<arr.length;i+=4){
arr.splice(i,0,",");
}
return arr.reverse().join("");
}
这些是我面试中遇到的一些题,如有错误请指正,感谢各位大佬花时间瞅瞅(๑•̀ㅂ•́)و✧