FCC学习笔记-(五) Basic Algorithm Scripting

(五) Basic Algorithm Scripting

1. Reverse a String

  • 反转字符串

    先把字符串转换为数组,反转后,再转换为字符串

//用到前面的函数
function reverseString(str) {
  str=str.split("");
  str.reverse();
  str=str.join("");
  return str;
}
reverseString("hello");  //return "olleh"

//简洁代码
function reverseString(str) {
    return str.split("").reverse().join("");
}

2. Factorialize a Number

  • 阶乘
//while循环
function factorialize(num) {
  var total = 1;
  while (num>0) {
    total *= num;
    num -= 1;
  }
  return total;
}

// 递归方法√
function factorialize(num) {
 if (num == 0) {
    return 1;
  }else {
    return factorialize(num-1)*num;
  }
}

3. Check for Palindromes

  • 判定回文字符串

RegExp 正则表达式

//首尾对比
function palindrome(str) {
  var str2 = str.toLowerCase().replace(/\W+|\_/g,"");
  len = Math.floor(str2.length/2);
  for (var i = 0;i < len; i ++) {
    if (str2[i] != str2[str2.length-i-1]) {
      return false;
    }
  }
  return true;
}

//通过反转字符串比较
function palindrome(str) {
    return str.toLowerCase().replace(/[\W_]/g,"") == str.toLowerCase().replace(/[\W_]/gi,"").split("").reverse().join("");
}

//首尾对比简洁代码
function palindrome(str) {
  str = str.toLowerCase().replace(/[\W_]/g,"");
  for (var i = 0;i < str.length/2; i ++) {
    if (str[i] != str[str.length-i-1]) {
      return false;
    }
  }
  return true;  
}

//指针方法
function palindrome(str) {
  var front = 0;
  var back = str.length - 1;
  while (back > front) {
    while ( str[front].match(/[\W_]/g) ) {
      front++;
      continue;
    }
    while( str[back].match(/[\W_]/g) ) {
      back--;
      continue;
    }
    while (str[front].toLowerCase() != str[back].toLowerCase() ) {
      return false;
    }
    front++;
    back--;
  }
  return true;

}

4. Find the Longest Word in a String

function findLongestWord(str) {
   //基本方法
  s = str.split(" ");
  maxlen = 0;
  for (var i = 0; i < s.length; i++) {
    if (maxlen < s[i].length) {
      maxlen = s[i].length;
    }
  }
  return maxlen;

  //reduce方法
  return str.split(" ").reduce(function(x,y){
    return Math.max(x,y.length);
  },0);

  //递归方法
  str = str.split(" ");
  if (str.length == 1) {
    return str[0].length;
  }

  if (str[0].length >= str[1].length) {
    str.splice(1,1); // splice 移除了str部分内容
    return findLongestWord(str.join(" "));
  }

  if (str[0].length <= str[1].length) {
    return findLongestWord(str.slice(1,str.length).join(" ")); // slice 只是复制str的部分内容
  }
}

5. Title Case a Sentence

  • 字符串中单词首字母大写

String.prototype.substr():与数组的Array.prototype.slice()类似


function titleCase(str) {
  //基本算法
  str = str.toLowerCase().split(" ");
  for (var i = 0; i < str.length; i++) {
    str[i] = str[i].split("");
    str[i][0] = str[i][0].toUpperCase();
    str[i] = str[i].join("");
  }
  return str.join(" ");

  //用replace
  str = str.toLowerCase().split(" ");
  for (var i = 0; i < str.length; i++) {
    str[i] = str[i].replace(/\w/,str[i][0].toUpperCase());
  }
  return str.join(" ");

  //改进基本方法
  String.prototype.replaceAt = function(index, character) {
    return this.substr(0,index) + character + this.substr(index + character.length);
  }; //放到函数titleCase外

  str = str.toLowerCase().split(" ");
  var updatedTitle = [];
  for (var st in str) {
    updatedTitle[st] = str[st].replaceAt(0,str[st].charAt(0).toUpperCase());
  }
  return updatedTitle.join(" ");

  //Map方法
  str = str.toLowerCase().split(" ");
  var updatedTitle = str.map(function(val) {
    return val.replace(val.charAt(0),val.charAt(0).toUpperCase());
  });
  return updatedTitle.join(" ");

  //正则表达式
  return str.toLowerCase().replace(/(^|\s)\S/g,(L) => L.toUpperCase());
 }
titleCase("sHoRt AnD sToUt");

6. Return Largest Numbers in Arrays

function largestOfFour(arr) {
  // reduce方法
  var maxArr =[];
  for (var i = 0; i < arr.length; i++) {
    maxArr[i] = arr[i].reduce(function (x,y) {
      return Math.max(x,y);
    });}
  return maxArr;

// map+reduce方法
  return arr.map(function(val) {
    return val.reduce(function(x,y) {
      return Math.max(x,y);});
  });

 // advanced solution 
  return arr.map(Function.apply.bind(Math.max,null));
}

largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

7. Confirm the Ending

function confirmEnding(str, target) {
  //substr 方法
  return str.substr(-target.length) == target;
  //substring 方法
  return str.substring(str.length - target.length) == target; 
}
confirmEnding("Bastian", "n");

8. Repeat a string

function repeatStringNumTimes(str, num) {
  //递归方法
  if (num == 1) {
    return str;
  }else if (num < 0) {
    return "";
  }
  return str + repeatStringNumTimes(str,num-1);

  // Conditional (ternary) Operator
  return num >0 ? str.repeat(num) : "";
}
repeatStringNumTimes("abc", 3);

9. Truncate a string

  • 缩短字符串
function truncateString(str, num) {
  // 基本方法
  if (num <3 ) {
    return str.slice(0,num) + "...";
  }
  if (str.length > num) {
    return str.slice(0,num-3) + "...";
  }else {
    return str;
  }

  //Conditional (ternary) Operator
   if (str.length <= num) {
     return str;
   }else {
     return str.slice(0, (num < 3 ? num : num-3)) + "...";
   }
}
truncateString("A-", 1);

10. Chunky Monkey

Array.prototype.splice()
Array.prototype.slice()


function chunkArrayInGroups(arr, size) {
  //slice 方法
  var arrg = [];
  for (var i = 0; i < arr.length; i += size)  {
     arrg.push(arr.slice(i,i+size));  
  }
  return arrg;
  // splice 方法
  var arrg = [];
  while (arr.length) {
    arrg.push(arr.splice(0,size));
  }
  return arrg;

}

chunkArrayInGroups(["a", "b", "c", "d"], 2);

11. Slasher Flick

  • 保存指定数组
function slasher(arr, howMany) {
  //splice方法
  arr.splice(0,howMany); //直接return是错误的
  return arr;
  //slice 方法
  return arr.slice(howMany);
}
slasher([1, 2, 3], 2);

12. Mutations

function mutation(arr) {
//基本方法  
  var arrg = arr[1].toLowerCase().split("");
  for (var st in arrg) {
    if (arr[0].toLowerCase().indexOf(arrg[st]) === -1) {
      return false;
    }
  }
  return true;

  //指针方法 
  var front = 0;
  while (front < arr[1].length) {
    if(arr[0].toLowerCase().indexOf(arr[1][front].toLowerCase()) !== -1) {
      front ++;
    }else {
      return false;
    }
  }
  return true;

  //every方法 √
  return arr[1].toLowerCase().split("").every(function (val) {
    return arr[0].toLowerCase().indexOf(val) !== -1;
  });

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

13. Falsy Bouncer

function bouncer(arr) {
  // filter 方法
  return arr.filter(function (val) {
    return Boolean(val);
  });
 // 简洁方法
  return arr.filter(Boolean);
}

bouncer([7, "ate", "", false, 9]);

14. Seek and Destroy


function destroyer(arr) {
  // filter + every 方法
  var args = Array.prototype.slice.call(arguments).slice(1);
  return arguments[0].filter(function (val) {
     return args.every(function (cal) {
       return cal !== val;
     });
  });
  //Arrow Function 方法
 var args = Array.prototype.slice.call(arguments).slice(1);
 return arguments[0].filter((val) => args.every((cal) => cal !== val) );
}

  //includes 方法
  var args = Array.prototype.slice.call(arguments).slice(1);
  return arr.filter(function(val) {
    return !args.includes(val);
  });
}

destroyer([1, 2, 3, 1, 2, 3], 2, 3);

15. Where do I belong

  • 把第二个参数放入第一个数组参数中排序

Array.prototype.sort()
Array.prototype.findIndex()
Array.prototype.concat()


function getIndexToIns(arr, num) {
  // 基本方法
  arr.sort(function (a,b) {
    return a - b;
  }); //sort 默认用于Unicode code points比较,即字符串
  var index = 0;
  for (var i = 0; i < arr.length; i++) {
    if(num > arr[i]) {
      index ++;  
    }
  }
  return index;

  //改进基本方法
  arr.sort(function (a,b) {
    return a - b;
  }); 
  for (var i = 0; i < arr.length; i++) {
    if(arr[i] >= num) {
      return i;
    }
  }
  return arr.length;

  //filter方法 (不用sort亦可)
  return arr.filter(function (val) {
    return num > val; 
  }).length;

  //findindex 方法
  var index = arr.sort((a, b) => a > b).findIndex((L) => L >= num);
  return index === -1 ? arr.length : index;

  //indexOF + push 方法
  arr.push(num);
  return arr.sort((a, b) => a > b).indexOf(num);

  //concat 方法√ (concat也可用于string)
  return arr.concat(num).sort((a, b) => a >b).indexOf(num);

}

getIndexToIns([2, 5, 10], 15);

16. Caesars Cipher

RegExp.prototype.test()
String.fromCharCode()
String.prototype.charCodeAt()
Function.prototype.apply()

function rot13(str) { 
  //基本方法
  return str.split("").map(function (val) {
    if (65 <= val.charCodeAt() && val.charCodeAt()  <=77) {
      return String.fromCharCode(val.charCodeAt() + 13);
    }
    if (78 <= val.charCodeAt() && val.charCodeAt() <=90) {
      return String.fromCharCode(val.charCodeAt() - 13);
    }
    return val;
  }).join("");

  //Regex 方法
  var updatedarr = [];
  var regex = /[A-Z]/;
  str = str.split("");
  for (var st in str) {
    if (regex.test(str[st])) {
        updatedarr.push((str[st].charCodeAt() - 65 + 13) % 26 + 65);
        }else {
          updatedarr.push(str[st].charCodeAt());
        }
  }
  str = String.fromCharCode.apply(String,updatedarr);
  return str;

  //Regex + replace 方法
  return str.replace(/[A-Z]/g,L => String.fromCharCode(L.charCodeAt(0) % 26 + 65));
}

rot13("SERR PBQR PNZC");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值