JavaScript Algorithms and Data Structures(六)

freeCodeCamp —- JavaScript Algorithms and Data Structures


基础算法

1. 将摄氏度转换为华氏度

从摄氏转换为华氏的公式是,摄氏温度乘以 9/5,再加上 32

输入参数 celsius 代表一个摄氏度的温度。 使用已定义的变量 fahrenheit,并赋值为相应的华氏度的温度值。 使用上面提到的公式来帮助将摄氏温度转换为华氏温度。

2. 反转字符串

反转提供的字符串并返回反转后的字符串。

例如, "hello" 应该变成 "olleh"

1
2
3
4
5
6
7
8
9
function reverseString(str) {
let reversedStr = "";
for (let i = str.length - 1; i >= 0; i--) {
reversedStr += str[i];
}
return reversedStr;
}

reverseString("hello");

3. 计算整数的阶乘

返回一个给定整数的阶乘计算结果。

对于整数 n,n 的阶乘就是所有小于等于 n 的正整数的乘积。

阶乘通常用符号 n! 来表示。

例如:5! = 1 * 2 * 3 * 4 * 5 = 120

只有非负整数会作为参数传入函数。

4. 找出字符串中的最长单词

返回给出的句子中,最长单词的长度。

函数的返回值应是一个数字。

1
2
3
4
5
6
7
8
9
10
11
function findLongestWordLength(str) {
let arr = str.split(' ');
let maxleng = 0;
for (let i = 0; i < arr.length; i++){
maxleng = maxleng < arr[i].length ? arr[i].length : maxleng
}
console.log(maxleng);
return maxleng;
}

findLongestWordLength("The quick brown fox jumped over the lazy dog");

5. 找出多个数组中的最大数字

请返回一个数组,该数组由参数中每个子数组中的最大数字组成。 为简单起见,给出的数组总会包含 4 个子数组。

别忘了,你可以通过 for 循环遍历一个数组,并用 arr[i] 的写法来访问数组中的元素。

6. 确认结尾

检查字符串(第一个参数 str)是否以给定的目标字符串(第二个参数 target)结束。

7. 重复输出字符串

将一个给定的字符串 str(第一个参数)重复输出 num(第二个参数)次。 如果 num 不是正数,返回空字符串。 在这个挑战中,请不要使用 JavaScript 内置的 .repeat() 方法。

8. 截断字符串

如果传入的字符串(第一个参数)的长度大于传入的值(第二个参数),请在这个位置截断它, 并在后面加上 ...,然后返回结果。

9. 按参数过滤数组

请写一个函数来检查数组(第一个参数 arr)中的元素,并返回数组中第一个通过校验测试的元素。 其中,“通过校验测试”指的是对于数组中的一个元素 x,若 func(x) 返回的结果为 true,则校验测试通过。 如果没有元素通过测试,请返回 undefined

10. 基本类型布尔值的检查

检查一个值是否是基本类型中的布尔值(boolean)类型。 函数应返回 true 或者 false

基本类型中的布尔值为 true 或者 false

11. 句中单词首字母大写

请将传入的字符串中,每个单词的第一个字母变成大写并返回。 注意除首字母外,其余的字符都应是小写的。

在这个挑战中,我们还需要将诸如 the 和 of 之类的连接词大写

1
2
3
4
5
6
7
8
9
10
11
function titleCase(str) {
const newTitle = str.split(" ");
const updatedTitle = [];
for (let st in newTitle) {
updatedTitle[st] = newTitle[st][0].toUpperCase() + newTitle[st].slice(1).toLowerCase();
}
console.log(updatedTitle.join(" "))
return updatedTitle.join(" ");
}

titleCase("I'm a little tea pot");

12. Slice 与 Splice

本挑战的输入参数为两个数组和一个索引值。

将第一个数组中的所有元素依次复制到第二个数组中。

请注意,你需要从第二个数组索引值为 n 的地方开始插入。

最后,请返回插入元素后的数组。 作为输入参数的两个数组在函数执行前后应保持不变。

13. 过滤数组中的假值

从数组中移除所有假值(falsy values)。 返回一个新数组;不要改变原始数组。

JavaScript 中的假值有 falsenull0""undefinedNaN

提示:可以考虑将每个值都转换为布尔值(boolean)。

14. 找出元素在排序后数组中的索引

数组(第一个参数)在排序后,将一个值(第二个参数)插入该数组,并使数组保持有序。返回这个新插入元素的最小索引值。 返回值应为一个数字。

例如,getIndexToIns([1,2,3,4], 1.5) 应该返回 1 因为1.5 大于 1(索引为 0)且小于 2(索引为 1)。

同样地,getIndexToIns([20,3,5], 19) 应该返回 2。 因为数组排序后会变成 [3,5,20],而 19 小于 20(索引为 2)且大于 5(索引为 1)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function getIndexToIns(arr, num) {
if(arr.length ===0) return 0 ;
const len = arr.length;
for (let i = 0; i < len - 1; i++) {
for (let j = 0; j < len - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
const temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (let i = 0; i < arr.length; i++) {
if (arr[i] >= num) return i;
}
return arr.length;
}

getIndexToIns([40, 60], 50);

15. 比较字符串

如果数组里的第一个字符串包含了第二个字符串中的所有字母,则返回 true

例如,["hello", "Hello"] 应该返回 true。因为在忽略大小写的情况下,第一个字符串包含了第二个字符串里出现的所有字母。

["hello", "hey"] 应该返回 false。因为 hello 并不包含字符 y

最后,["Alien", "line"] 应该返回 true。因为 line 中的所有字母都出现在了 Alien 中。

1
2
3
4
5
6
7
8
9
10
function mutation(arr) {
const test = arr[1].toLowerCase();
const target = arr[0].toLowerCase();
for (let i = 0; i < test.length; i++) {
if (target.indexOf(test[i]) < 0) return false;
}
return true;
}

mutation(["hello", "hey"]);

16. 分割数组

请编写一个函数,该函数将一个数组(第一个参数)拆分成若干长度为 size(第二个参数)的子数组,并将它们作为二维数组返回。