Back
Featured image of post JavaScript | Basic Algorithm Scripting

JavaScript | Basic Algorithm Scripting

本来以为不用写这个,结果发现忘得差不多了。还是得写。

基础操作

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));
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy