JS 数据结构和算法基础习题(FCC)

本文最后更新于 2021年4月4日 晚上

这篇是跟着 FCC 的 JS 数据结构和算法基础题走的时候的一些记录.

数据结构和一些简单算法

  1. 使用数组

  2. 按值复制数组, 可以使用 [...数组名]:

1
2
let newArr = [...newArray];
console.log(newArr);
  1. 可以使用 [...数组名] 将某数组的元素插入到相应的位置:
1
2
3
let aArray = [1, 2, 3, 4];
let newArray = [1, 5, 1, 10, ...aArray];
console.log(newArray); // 输出[ 1, 5, 1, 10, 1, 2, 3, 4 ]

下面是一些简单的算法:

摄氏转华氏:

1
2
3
4
5
6
function getFahrenheitFrom(celsius) {
if ((typeof celsius) != 'number') {
throw Error('无法转换非数值类型参数');
}
return celsius * 9.0 / 5.0 + 32.0;
}

字符串反转:

1
2
3
4
5
function reverseString(str) {
if (str == undefined || str == null) { return null; }
if ((typeof str) != 'string') { throw Error('参数非字符串类型'); }
return str.split('').reverse().join('');
}

阶乘:

1
2
3
4
5
6
7
8
9
10
11
function factorialize(num) {
if (num == null || num == undefined) { return null; }
let type = typeof num;
if (type != "number") { return null; }
if (num == 0) { return 1; }
let result = 1;
for (let i = 1; i <= num; ++i) {
result *= i;
}
return result;
}

阶乘递归版本:

1
2
3
4
5
6
7
function factorialize(num) {
if (num == null || num == undefined) { return null; }
let type = typeof num;
if (type != "number") { return null; }
if (num == 0) { return 1; }
return num * factorialize(num - 1);
}

字符串反转的递归版本:

1
2
3
4
5
6
7
8
9
10
// 这个的递归模式就是最后一个加上前面剩余的反转.
function reverseString(str) {
if (str == null || str == undefined) { return ""; }
let type = typeof str
if (type != "string") { return ""; }
if (str.length == 1) { return str; }
// 怎么表示前面剩余的字符串? 通过 substring 获取从开始index到结尾 index前闭后开区间的子串.
let length = str.length;
return str[length - 1] + reverseString(str.substring(0, length - 1))
}

找字符串中的最长单词:

1
2
3
4
5
6
7
8
9
function findLongestWordAmong(str) {
let regex = /\w+/ig
let lengthArr = str.split(' ')
.map((value, index, arr) => {
return value.length;
})
.sort((a, b) => a < b);
return lengthArr[0];
}

找数组中最大值: 挨个判断过去即可

1
2
3
4
5
6
function max(arr) {
return arr.reduce((prev, current, arr) => {
if (prev >= current) { return prev; }
return current;
});
}

找字符串中是否以某字符串结尾:

1
2
3
4
5
6
7
function endWith(str, end) {
// ES6 提供了这个函数可用
// return str.endsWith(end);
// 若不是 ES6, 则: 使用 RegExp 对象可以将模式用字符串表示.
let regex = new RegExp(`${end}$`, 'ig');
return regex.test(str);
}

字符串超长后截取指定长度, 超长部分以 ... 代替: 使用 substring 就可以达到目的.

判断某个值是否为布尔值:

1
2
3
4
5
6
function booWho(value) {
if (value == null || value == undefined) { return false; }
let type = typeof value;
if (type != "boolean") { return false; }
return true;
}

可以使用如下方式验证:

1
2
3
4
5
6
7
8
9
10
let a = true;
let b = false;
let aa = "true";
let bb = "false";

console.assert(booWho(a) === true);
console.assert(booWho(b) === true);

console.assert(booWho(aa) === false);
console.assert(booWho(bb) === false);

将某个字符串中的所有单词首字母大写, 其余小写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function titleCase(str) {
let lower = str.toLowerCase();

// 将字符串分割
let arr = lower.split(' ');

// 将每个单词首字母大写:
for (let i = 0; i < arr.length; ++i) {
arr[i] = uppercasedStart(arr[i]);
}
return arr.join(' ');
}

function uppercasedStart(word) {
if (word.length <= 0) { return ""; }
if (word.length == 1) { return word.toUpperCase(); }
return word[0].toUpperCase() + word.substring(1, word.length);
}

在 JS 中有如下的量都代表 false 的含义(在逻辑表达式中):

1
false, null, 0, "", undefined, NaN.

则从数组中过滤掉这些值, 只需要用逻辑判断即可:

1
2
3
4
5
6
7
8
9
10

let containsFalsyValueArray = [1, 2, 0, 8, undefined, null, 0, "", NaN];

console.log(containsFalsyValueArray);

let pureArray = containsFalsyValueArray.filter((value, index, arr) => {
return value;
})

console.log(pureArray);

输出如下所示:

1
2
[ 1, 2, 0, 8, undefined, null, 0, '', NaN ]
[ 1, 2, 8 ]

在做数组分若干份的时候还涨了一次知识. 9 个空挡放 3 块板的抽象, 就是选空挡插板.

如何记录这些过程, 通过一个简单的 todo list 来做的话应该如何进行? 这种记录在移动端的记录难度比较大, 主要还是输入太费劲, 在 pc 端倒是非常好, 但是需要使用 web 的方式方便保存查看和随时添加, 这样的话也可以扩展到移动端, 因为直接就可以在网页上访问.


JS 数据结构和算法基础习题(FCC)
https://blog.rayy.top/2019/01/27/2019-44-js-algo-basic-fcc/
作者
貘鸣
发布于
2019年1月27日
许可协议