算法题
最大子数组
题目:输入是以数字组成的数组,例如 arr = [1, -2, 3, 4, -9, 6]。任务是:找出所有项的和最大的 arr 数组的连续子数组。写出函数 getMaxSubSum(arr),用其找出并返回最大和。
思路:让我们遍历数组,将当前局部元素的和保存在变量 s 中。如果 s 在某一点变成负数了,就重新分配 s=0。所有 s 中的最大值就是答案。
时间复杂度:该算法只需要遍历 1 轮数组,所以时间复杂度是 O(n)。
把由短划线分隔的单词变成小驼峰式
题目:编写函数 camelize(str)
将诸如"my-short-string"之类的由短划线分隔的单词变成骆驼式的"myShortString"。示例:
camelize("background-color") == 'backgroundColor';
camelize("list-style-image") == 'listStyleImage';
camelize("-webkit-transition") == 'WebkitTransition';
思路:使用 split 将字符串拆分成数组,对其进行转换之后再 join 回来。
创建一个可扩展的 calculator
题目:创建一个构造函数 Calculator,以创建“可扩展”的 calculator 对象。首先,实现 calculate(str)
方法,该方法接受像 "1 + 2" 这样格式为“数字 运算符 数字”(以空格分隔)的字符串,并返回结果。该方法需要能够理解加号 + 和减号 -。然后添加方法 addMethod(name, func)
,该方法教 calculator 进行新操作。它需要运算符 name 和实现它的双参数函数 func(a,b)
。
思路:将运算存储在 this.methods
属性中。所有检测和数字转换都通过 calculate 方法完成。将来可能会扩展它以支持更复杂的表达式。
随机排列数组的元素
题目:要编写一个 JavaScript 函数来随机排列数组的元素。
思路是:我们可以使用 Fisher-Yates 洗牌算法,其思路是 逆向遍历数组,并将每个元素与其前面的随机的一个元素互换位置。
function shuffle(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
/*
上面使用了 “解构分配(destructuring assignment)”语法 来实现交换元素 array[i] 和 array[j]
也可以使用:let t = array[i]; array[i] = array[j]; array[j] = t
*/
过滤字谜(anagrams)
思路:为了找到所有字谜(anagram),让我们把每个单词打散为字母并进行排序。当字母被排序后,所有的字谜就都一样了。然后利用Map或Object的key的唯一性进行过滤。
使用Map
使用Object