算法面试题2

122 阅读1分钟

Q字符串中出现最多的字母?

function findMax(str) {
	if(str.length == 1) {
		return str;
	}
	let charObj = {};
	for(let i = 0; i < str.length; i ++) {
		if(!charObj[str.charAt(i)]) {
			charObj[str.charAt(i)] = 1;
		} else {
			charObj[str.charAt(i)] += 1;
		}
	}
	let maxChar = '';
	maxValue = 1;
	for(var k in charObj) {
		if(charObj[k] >= maxValue) {
			maxChar = k;
			maxValue = charObj[k];
		}
	}
	return maxChar;
}

module.exports = findMax

Q冒泡排序

冒泡排序就是依次比较大小,小的大的进行位置上的交换。

function bubbleSort(arr) {
	for(let i = 0; i < arr.length - 1; i ++) {
		for(let j = i + 1; j < arr.length; j ++) {
			if(arr[i] > arr[j]) {
				let tem = arr[i];
				arr[i] = arr[j];
				arr[j] = tem;
			}
		}
	}
	return arr;
}

module.exports = bubbleSort;

# Q快速排序

快排核心思想是 :

选定一个基准x,将比x小的值放到左边,比x大的值放到右边。

const partition = (arr, left, right) => {
	let x = arr[left];
	let i = left;
	let j = right;
	
	while(i < j) {
		//先从前往后找小的,没找的的话一直继续
			while( i < j && arr[j] > x) {
				j --;
			}
			//找到了,将值填入坑里面,a[j]又变成了坑
			if(i < j) {
				a[i] = a[j];
			}
			
			//然后从前往后找大的,没找到继续找。
			while(i < j && arr[i] < x) {
				i ++;
			}
			//找到了,将值填入之前的坑里。
			if(i < j) {
				a[j] = a[i]
			}
		}
		
		//将基准值填入坑
		a[i] = x;
		return i;
	}
	
	const quickSort = (arr,left,right) => {
		const length = arr.length;
		const start = left || 0;
		const end = right !== undefined ? right : length - 1;
		
		if(start < end) {
			const index = partition(arr, start, end;)
			quickSort(arr, start, index - 1);//调整基准值左边
			quickSort(arr,index + 1,end); //调整基准值右边
		}
		return arr;
	}




使用:
const newArr = [2, 3, 1, 4, 6, 5, 9, 8, 7];

// 测试下
let result = quickSort(newArr);
console.log(result);   // [1, 2, 3, 4, 5, 6, 7, 8, 9]

未完待续。。。

快排算法2

算法参考某个元素值,将小于它的值放到左数组中,大于它的值放在右数组中。然后进行递归进行左右数组的操作。返回合并的数组就是已经排好顺序的数组了。

function quickSort(arr) {
	if(arr.length < = 1) {
		return arr;
	}
	let leftArr = [];
	let rightArr = [];
	let q = arr[0];
	
	for(let i = 1; i < arr.length; i ++) {
		if(arr[i] > q) {
			rightArr.push(arr[i])
		} else {
			leftArr.push(arr[i])
		}
	}
	return [].concat(quickSort(leftArr),[q],quickSort(rightArr));
}

module.exports = quickSort;

一个容易理解的快排动画

扫码可以领10g前端资料,也可回复加群,加入交流群。

另有github每日更新精选面试题欢迎star github.com/qdleader/qd…