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

149 阅读2分钟

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

前言

本期将提到的算法题目为字符串截取算法,数组查询算法,寻找数组间差异算法,每期致力于用最少的代码行解决其问题。

字符串截取算法

如果字符串的长度比给定的参数num长,则把多余的部分用...来表示。 切记,插入到字符串尾部的三个点号也会计入字符串的长度。 然而,如果指定的参数num小于或等于3,则添加的三个点号不会计入字符串的长度。

例如:

truncate("A-tisket a-tasket A green and yellow basket", 11) // "A-tisket..."

思路

  1. 先判断传入字符串是否大于长度要求,如果不大于原样返回。
  2. 如果大于,则用substr剥离出num-3个字符再加上...作为尾部。

实现

function truncate(str, num) {
	return (str.length > num) ? 
        (str.substr(0, (num > 3 ? (num - 3) : num)) + "...") : str
}

数组查询算法

如果数组第一个字符串元素包含了第二个字符串元素的所有字符,则函数返回true。 举例,["hello", "Hello"]应该返回true,因为在忽略大小写的情况下,第二个字符串的所有字符都可以在第一个字符串找到。 ["hello", "hey"]应该返回false,因为字符串"hello"并不包含字符"y"。 ["Alien", "line"]应该返回true,因为"line"中所有字符都可以在"Alien"找到。

例如:

mutation(["hello", "hey"]) // false
mutation(["Alien", "line"]) // true

思路

  1. 因为忽略了大小写所以先将他们进行统一,做小写处理。
  2. 再利用some方法去遍历第二个字符串的单词,然后通过indexOf判断这个单词是否存在。
  3. some方法本身就返回的是一个Boolean类型的值。

实现

function mutation(arr) {
	let str1 = arr[0].toLowerCase();
	let str2 = arr[1].toLowerCase();
	return ![].some.call(str2, n => !~str1.indexOf(n));
}

寻找数组间差异算法

比较两个数组,然后返回一个新数组,该数组的元素为两个给定数组中所有独有的数组元素。换言之,返回两个数组的差异。

例如:

diff([1, 2, 3, 5], [1, 2, 3, 4, 5]) // [4]

思路

  1. 先将两个数组组合起来。
  2. 再用filter方法做遍历,来做过滤。只保留不存在数组1或者不存在数组2的数值。

实现

function diff(arr1, arr2) {
	return [].filter.call(arr1.concat(arr2), n => {
		if(arr1.indexOf(n) === -1 || arr2.indexOf(n) === -1) return true;
	})
}