面题系列:算法习题集(一)

257 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

本期将提到的算法题目为回文算法,寻找最长单词算法,数组分割算法,每期致力于用最少的代码行解决其问题。

回文算法

如果给定的字符串是回文,返回true,反之,返回false。 palindrome(回文)是指一个字符串忽略标点符号、大小写和空格,正着读和反着读一模一样。 注意:您需要删除字符串多余的标点符号和空格,然后把字符串转化成小写来验证此字符串是不是回文。 函数参数的值可以为"racecar","RaceCar"和"race CAR"。

例如:

palindrome("My age is 0, 0 si ega ym.") // true

思路

  1. 首先按题目要求所以用正则过滤掉删除字符串多余的标点符号和空格,并且都变成小写。
  2. 再将字符串用split方法转化为数组。
  3. 然后用js的reverse方法将数组反向排列。
  4. 最后再把反向排列的数组变成字符串,把原字符串与反转后的字符串做对比,如果相同则为回文数。

实现

function palindrome(str) {
	let re = /[\W_]/g; // 或者 var re = /[^A-Za-z0-9]/g;
	let lowRegStr = str.toLowerCase().replace(re, '');
	let reverseStr = lowRegStr.split('').reverse().join('');
	return reverseStr === lowRegStr;
}

寻找最长单词算法

寻找一个句子中最长单词,并返回提供的句子中最长的单词的长度。 返回值应该是一个数字。

例如:

findLongestWord("The quick brown fox jumped over the lazy dog") // 6

思路

  1. 通过split方法先将传入的字符串拆分出单词,变成一个数组。
  2. 然后通过map遍历得到一个新数组,里面存放在每一个单纯的字符串。
  3. 最后,只要通过Math.max取出数组内的最大长度即可。

实现

function findLongestWord(str) {
	let arr = str.split(' ');
	return Math.max(...[].map.call(arr,value=>value.length));
}

数组分割算法

编写一个函数,把一个数组arr按照指定的数组大小size分割成若干个数组块。 例如:

chunk([1,2,3,4],2) // [[1,2],[3,4]];
chunk([1,2,3,4,5],2) // [[1,2],[3,4],[5]];

思路

  1. 首先遍历输入的数组,其size大小怎么i的增加量。
  2. 通过slice拆分出size大小的数组,push到新数组内。

实现

function chunk(arr, size) {
	let _arr = [];
	for(let i = 0; i < arr.length; i += size) {
            _arr.push(arr.slice(i, i + size));
	}
	return _arr;
}