基础操作
fcc example挑选一些整理。
reverse a string
针对string的reverse是比较常见的基础题,Three Ways to Reverse a String in JavaScript.
这个链接直接给出三种解法,一二能自己写出来,第三种知道递归能做,但也就是知道。
第一种解法思路:
function reverseString(str) {
return str.split("").reverse().join("");
}
reverseString("hello");
split,reverse,join 分别是三个build-in 函数。
- split是把string 切割为 array(但并不影响原str),这个split()内 放什么内容也直接影响array长啥样。打个比方说,这种武功等于照相,你长啥样照下来再根据需求PS了,但是不影响你本人真实的脸。
- reverse() 是针对的array,是翻转array序列的结果。这个是直接作用在array上。这个就等于直接做整容,对作用的对象直接给改了。
- join()是把array又重新变成str的一个方法,和split类似,也只是生成一个str,这个str不会对作用的array有啥影响。
第二种:
function reverseString(str) {
var newString = "";
for (var i = str.length - 1; i >= 0; i--) {
newString += str[i];
}
return newString;
}
reverseString('hello');
//ES6提供的写法,循环更简洁了。
const reverseString = (str) => {
let reversed = '';
for (const c of str) {
reversed = c + reversed;
}
return reversed;
};
这个直接从str本身入手,str是一种特殊的array,因为str也是有index的,因此,从这个直接去获取str的倒数字符,一个个再通过str的自带+号合并来追加到新str。
这些思路前提都是得熟练掌握在MDN里检索和查看该对象的build-in function。
第三种:
function reverseString(str) {
if (str === "")
return "";
else
return reverseString(str.substring(1)) + str.charAt(0);
}
console.log(reverseString("hello"));
这个采用的就是recursion,chatAt()函数是针对string的,是获取该string的第一个character, substr()这个函数虽然还能用,但是已经在web标准中删除了,推荐使用substring(),这个里面的数字等于是string cupture range,只有一个就是从这个index开始全部包含。
step | result |
---|---|
1 | re(ello) + h |
2 | re(llo) + e + h |
3 | re(lo) + l + e + h |
4 | re(o) + l + l + e + h |
5 | '' + o + l + l + e + h |
string 的 add(+) 是从左到右加的,recursion就是自己调用自己,从结果来看,最后的结果要知道step5才一起返回。
Factorialize a Number
这个就是求阶乘,一开始只写出第一种,后面把上面的reverse string 的recursion细细写完,还是写出了第二种,哈哈哈,说明,一切的困难都是练太少!
这个也有人写好几种解法:Three Ways to Factorialize a Number in JavaScript
第一种:
function factorialize(num) {
let sum = 1;
for(let i = 1; i<=num;i++){
sum *= i;
}
return sum;
}
这个应该就是最简单的思路,既然有个最后的乘积,那就直接定义sum=1,然后循环,从1到num都往sum上乘。
第二种
function factorialize(num){
if(num>1){
return factorialize(num-1)*num;
}else{
return 1;
}
}
0和1的阶乘都是1,我突然还有点忘了0为什么是1,why 0 factorial is 1,会忘说明以前也没懂过。
Find the Longest Word in a String
这个也有人写三种解法 Three Ways to Find the Longest Word in a String in JavaScript
第一种
function findLongestWordLength(str) {
let arr = str.split(" ");
let find = 0;
for(const c in arr){
if (arr[c].length > find){
find = arr[c].length
}
}
return find;
}
比较直接的思路,先处理字符串,再处理值的循环和覆盖。
第二第三种我觉得不好想,兴趣不大,不做。
Return Largest Numbers in Arrays
这个是返回一个,每个子array中最大的数,组成的array。
这个也有人写了Three ways you can find the largest number in an array using JavaScript,不过我的感觉和作者的没啥关系…..
我的解法
function largestOfFour(arr) {
let large = [];
for(const li in arr){
large.push(Math.max(...arr[li]));
}
return large;
}
思路比较简单,我想咋都要返回一个array,还是要新建一个,然后用了for in 找到每一个子array最大的数字,push到这个array里,就是最后的成果。
延展思路
这道题可以延伸一下,如果要找到不是一个二层array,而是不知道多少层,每一层嵌套的层级还不一样,哈哈哈,那么是不是就应该是recursion来找?
要输出的也不是array,应该是一个最大的数。
思路1:遍历里更新那个最大的数字
function largest(arr) {
if (typeof arr === "number") {
return arr;
}
let max = 0;
for (let c in arr) {//遍历每一个元素
if (Array.isArray(arr[c])) {// 如果被遍历元素是数组的话
max = Math.max(max, largest(arr[c]));//开始调用自己,因为max最后是个数字,因此可以这么比较
continue // 继续
}
max = Math.max(max, arr[c]);//就算该元素不是数组,也得比对一下更新
}
return max;
}
const array1 = [1, 2, 3, 4, [5, 6, 7, 8, [9, 10, 11, 12, [13, 14, 15, 16]], [56, 57]], [17, 18, 19, 20, [29, 30, 31, 32, [43, 44, 45, 55]]]]
console.log(largest(array1));
//57
思路2: 数据拍平再处理
let newarr = [];// 这个用来放所有arr里的最
function largest(arr) {
for(let c in arr){
if(Array.isArray(arr[c])){
largest(arr[c]);//是数组就要被接着展开
}else{
newarr.push(arr[c]);// 不是数组就塞进newarr
}
}
return Math.max(...newarr);//返回一个arr里的最大数字
}
const array1 = [1, 2, 3, 4, [5, 6, 7, 8, [9, 10, 11, 12, [13, 14, 15, 16]], [56, 57]], [17, 18, 19, 20, [29, 30, 31, 32, [43, 44, 45, 55]]]]
console.log(largest(array1));
//57
Finders Keepers
原来还可以这么传递函数,感觉好丑。
function findElement(arr, func) {
for(let c in arr){
if(func(arr[c])){
return arr[c];
}
}
return undefined;
}
console.log(findElement([1, 2, 3, 4], num => num % 2 === 0));
还有个办法要简单点Array.find()
function findElement(arr, func) {
return arr.find(func);
}
title case
格式化句子,每个单词首字母大写。
function titleCase(str) {
let newstr = str.toLowerCase().replace(/(^|\s)\S/g,ele => ele.toUpperCase());
return newstr;
};
regex果然是神器,但是果然好难想哦。
Slice and Splice
在数组中指定的位置插入另一个数组元素们。
function frankenSplice(arr1, arr2, n) {
return arr2.slice(0,n).concat(arr1,arr2.slice(n));
}
console.log(frankenSplice([1, 2, 3], [4, 5, 6], 1));
这个解法是一种,slice切片分两截,再和concat合并挺好用的。
Where do I Belong
在有序中找到新数据位置,获取所在index。
function getIndexToIns(arr, num) {
arr.push(num);// 插了再说
arr.sort((a,b) => a-b);//排序
return arr.indexOf(num);// 返回index
}
getIndexToIns([40, 60], 50);
Mutations
忽略大小写,arr[1]的character是否全部在arr[0]中?
function mutation(arr) {
for(let c in arr[1].toLowerCase().split("")){// 想偷懒感觉反而写得有点丑
if(arr[0].toLowerCase().includes(arr[1].toLowerCase().split("")[c])){// includes是个返回bool的method,
continue
}else{
return false;
}
};
return true; // 没机会反悔false在返回true
}
const array1 = ["hello", "Hello"];
console.log(mutation(array1));
chunky monkey
按着size长度切割arr为多个子arr,返回一个二维arr。
function chunkArrayInGroups(arr, size) {
let chunk = [];
for(let i = 0;i< arr.length/size;i++){//size后,到点就截止。
chunk.push(arr.slice(i*size,(i+1)*size));// 这个slice用两个乘法搞出步长的感觉。
}
return chunk;
}
console.log(chunkArrayInGroups([0, 1, 2, 3, 4, 5, 6], 3));