FCC中级算法(三)

来源:互联网 发布:手机版如何开淘宝店铺 编辑:程序博客网 时间:2024/05/20 18:47

1.Convert HTML Entities

将字符串中的字符 &、<、>、" (双引号), 以及 ' (单引号)转换为它们对应的 HTML 实体。


思路:通过正则去匹配,用replace()方法替换。

function convert(str) {  // :)  return str.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")            .replace(/\"/g,""").replace(/\'/g,"'");}convert("Dolce & Gabbana");


2.Spinal Tap Case (参考网友方法)

将字符串转换为 spinal case。Spinal case 是 all-lowercase-words-joined-by-dashes 这种形式的,也就是以连字符连接所有小写单词。

例如:spinalCase("This Is Spinal Tap") 应该返回 "this-is-spinal-tap"。

            spinalCase("thisIsSpinalTap") 应该返回 "this-is-spinal-tap"。

            spinalCase("The_Andy_Griffith_Show") 应该返回 "the-andy-griffith-show"。

            spinalCase("Teletubbies say Eh-oh") 应该返回 "teletubbies-say-eh-oh"。


思路:/_/g, " "  将下划线替换成空格,

            /([A-Z])/g," $1"  在大写字母前面加空格,

            /^\s/, "" 去掉首字母为大写时的空格,其中 "^" 表示语句开头, "\s" 表示空白符。

            /\s+/g, "-"  替换成"-"号。

function spinalCase(str) {  // "It's such a fine line between stupid, and clever."  // --David St. Hubbins  str = str.replace(/_/g, " ").replace(/([A-Z])/g," $1").replace(/^\s/, "").replace(/\s+/g, "-")     .toLowerCase();  return str;}spinalCase('This Is Spinal Tap');


3.Sum All Odd Fibonacci Numbers

给一个正整数num,返回小于或等于num的斐波纳契奇数之和。
斐波纳契数列中的前几个数字是 1、1、2、3、5 和 8,随后的每一个数字都是前两个数字之和。
例如,sumFibs(4)应该返回 5,因为斐波纳契数列中所有小于4的奇数是 1、1、3。

提示:此题不能用递归来实现斐波纳契数列。因为当num较大时,内存会溢出,推荐用数组来实现


function sumFibs(num) {  var fibo = [1, 1];  var nums = 2;  var temp = 0;  while(true){    temp = fibo[0] + fibo[1];    if(temp > num){       return nums;    }    if(temp % 2 !== 0){      nums += temp;    }    fibo[0] = fibo[1];    fibo[1] = temp;     }}sumFibs(1);

4.Sum All Primes

求小于等于给定数值的质数之和。
只有 1 和它本身两个约数的数叫质数。例如,2 是质数,因为它只能被 1 和 2 整除。1 不是质数,因为它只能被自身整除。
给定的数不一定是质数。


思路:要求质数之和,首先要判断这个数是否为质数。在一般领域,对正整数n,如果用2到 n的算术平方根之间的所有整数去除,均无法整除,则n为质数。下面的判断方法是百度百科里面的判断方法。。。

function sumPrimes(num) {  var temp = 0;  function isPrime(n){    if (n <= 3) { return n > 1; }    if (n % 2 === 0 || n % 3 === 0) { return false; }     for (var  i = 5; i * i <= n; i += 6) {        if (n % i === 0 || n % (i + 2) === 0) { return false; }    }    return true;  }    for(var i = 1; i <= num; i++){      if(isPrime(i)){        temp += i;      }    }  return temp;}sumPrimes(977);


5.Smallest Common Multiple 

找出能被两个给定参数和它们之间的连续数字整除的最小公倍数。
范围是两个数字构成的数组,两个数字不一定按数字顺序排序。
例如对 1 和 3 —— 找出能被 1 和 3 和它们之间所有数字整除的最小公倍数。


思路:先将arr排序,再用循环将从arr[0]到arr[1]递增的数压入新的数组当中。当求n个数的最小公倍数时,可以先求两个数的最小公倍数,再用这个最小公倍数和第三个数求最小公倍数,如此循环直到n,最后所得的那个最小公倍数,就是n个数的最小公倍数。而两个数的乘积等于这两个数的最大公约数与最小公倍数的积,所以我们可以先求最大公约数,在用公式去得出最小公倍数。

var gcd = function(a,b){    var gcd = function(a,b){    if(a%b === 0) return b;    return gcd(b,a%b);  };  };

最大公约数:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数,即gcd(a,b)=gcd(b,a%b)。

比如:求(140,21)    140%21 = 14              21%14 = 7                  14%7 = 0, 则返回7


function smallestCommons(arr) {  arr.sort(function(a,b){return a-b;});  var arrs = [];  for(var i = arr[0]; i <= arr[1]; i++){    arrs.push(i);  }    var gcd = function(a,b){    if(a%b === 0) return b;    return gcd(b,a%b);  };   return arrs.reduce(function(a,b){    return a*b/gcd(a,b);  });}smallestCommons([5,1]);




0 0
原创粉丝点击