Freecodecamp 算法題
1. Reverse a String
翻轉(zhuǎn)字符串
先把字符串轉(zhuǎn)化成數(shù)組铛纬,再借助數(shù)組的reverse方法翻轉(zhuǎn)數(shù)組順序,最后把數(shù)組轉(zhuǎn)化成字符串刨裆。
你的結(jié)果必須得是一個字符串
當你完成不了挑戰(zhàn)的時候,記得開大招'Read-Search-Ask'彬檀。
這是一些有幫助的資源:
思路:先把字符串轉(zhuǎn)化成數(shù)組帆啃,再借助數(shù)組的reverse方法翻轉(zhuǎn)數(shù)組順序,最后把數(shù)組轉(zhuǎn)化成字符串窍帝。
function reverseString(str) {
str = str.split('').reverse().join('')努潘;
return str;
}
reverseString("hello");
2. Factorialize a Number
如果用字母n來代表一個整數(shù),階乘代表著所有小于或等于n的整數(shù)的乘積。
階乘通常簡寫成 n!
例如: 5! = 1 * 2 * 3 * 4 * 5 = 120
- 方法一:
function factorialize(num) {
if (num <= 1) {
return 1;
}else {
return factorialize(num - 1) * num;
}
return num;
}
factorialize(10);
- 方法二
function factorialize(num) {
if(num<=1){return 1;}
var number=1;
let n;
for(n =1; n<num;n++){
number *= n+1
}
return number;
}
factorialize(5);
3. Check for Palindromes
檢查回文字符串
如果給定的字符串是回文疯坤,返回true报慕,反之,返回false压怠。
如果一個字符串忽略標點符號眠冈、大小寫和空格,正著讀和反著讀一模一樣菌瘫,那么這個字符串就是palindrome(回文)蜗顽。
注意你需要去掉字符串多余的標點符號和空格,然后把字符串轉(zhuǎn)化成小寫來驗證此字符串是否為回文雨让。
函數(shù)參數(shù)的值可以為"racecar"雇盖,"RaceCar"和"race CAR"。
function palindrome(str) {
var regex = /[^a-zA-Z0-9]/g;
var tmpStr = str.replace(regex,'').toLowerCase().split('');
if(tmpStr.join('')===tmpStr.reverse().join('')){
return true;
}else{
return false;
}
}
palindrome("eye");
4. Find the Longest Word in a String
找出最長單詞
在句子中找出最長的單詞栖忠,并返回它的長度刊懈。
函數(shù)的返回值應該是一個數(shù)字。
思路:: 利用數(shù)組sort()方法娃闲,sort()方法需要接受一個比較函數(shù)虚汛,該函數(shù)要比較兩個值,然后返回一個用于說明這兩個值的相對順序的數(shù)字皇帮。比較函數(shù)應該具有兩個參數(shù) a 和 b卷哩,其返回值如下:
- 若 a 小于 b,在排序后的數(shù)組中 a 應該出現(xiàn)在 b 之前属拾,則返回一個小于 0 的值将谊。
- 若 a 等于 b,則返回 0渐白。
- 若 a 大于 b尊浓,則返回一個大于 0 的值。
function findLongestWord(str) {
var result = str.split(' ');
result.sort(function(firstElement, secondElement){
return secondElement.length-firstElement.length;
});
return result[0].length;
}
findLongestWord("The quick brown fox jumped over the lazy dog");
5. Title Case a Sentence
句中單詞首字母大寫
確保字符串的每個單詞首字母都大寫纯衍,其余部分小寫栋齿。
像'the'和'of'這樣的連接符同理。
思路:使用split分離str襟诸,使用slice()是首字母大寫
再就是toLowerCase()和toUpperCase()的用法瓦堵,要搞清前兩者和toLocaleLowerCase()、toLocaleUpperCase()的區(qū)別
function titleCase(str) {
var result = str.split(' ')
var newArray = [];
for(let i=0;i<result.length;i++){
var newStr=result[i].slice(0,1).toUpperCase() + result[i].slice(1).toLowerCase();
newArray.push(newStr);
}
return newArray.join(' ');
}
titleCase("I'm a little tea pot");
6. Return Largest Numbers in Arrays
找出多個數(shù)組中的最大數(shù)
右邊大數(shù)組中包含了4個小數(shù)組歌亲,分別找到每個小數(shù)組中的最大值菇用,然后把它們串聯(lián)起來,形成一個新數(shù)組陷揪。
思路:用for循環(huán)來迭代數(shù)組惋鸥,并通過arr[i]的方式來訪問數(shù)組的每個元素杂穷。
function largestOfFour(arr) {
var newArr=[];
for(var i=0;i<arr.length;i++){
let max=0;
for(var j=0;j<arr[i].length;j++){
if(arr[i][j] > max) max=arr[i][j];
}
newArr.push(max);
}
return newArr;
}
largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]])
7. Confirm the Ending
檢查字符串結(jié)尾
判斷一個字符串(str)是否以指定的字符串(target)結(jié)尾。
如果是卦绣,返回true;如果不是耐量,返回false。
function confirmEnding(str, target) {
var result;
str.substr(str.length-target.length,str.length)===target ? result= true : result = false;
return result;
}
confirmEnding("Bastian", "n");
8. Repeat a string repeat a string
重復輸出字符串
重復一個指定的字符串 num次迎卤,如果num是一個負數(shù)則返回一個空字符串。
思路:用concat在字符串后面重復字符串
function repeat(str, num) {
var result="";
if(num<=0) return "";
else {
for(let i=0;i<num;i++){
result=result.concat(str);
}
}
return result;
}
repeat("abc", 3);
9. Truncate a string
截斷字符串
如果字符串的長度比指定的參數(shù)num長玷坠,
則把多余的部分用...來表示蜗搔。
切記,插入到字符串尾部的三個點號也會計入字符串的長度八堡。
但是樟凄,如果指定的參數(shù)num小于或等于3,則添加的三個點號不會計入字符串的長度兄渺。
function truncate(str, num) {
var string='';
if(num<str.length){
if(num<=3){
string = str.slice(0,num)+'...';
return string;
}else{
string = str.slice(0,num-3)+'...';
return string;
}
}
return str;
}
truncate("A-tisket a-tasket A green and yellow basket", 11);
10. Chunky Monkey
猴子吃香蕉, 分割數(shù)組
把一個數(shù)組arr按照指定的數(shù)組大小size分割成若干個數(shù)組塊缝龄。
例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];
chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];
function chunk(arr, size) {
var newArr=[];
for(let i=0;i<arr.length;i+=size){
newArr.push(arr.slice(i,i+size))
}
return newArr;
}
chunk(["a", "b", "c", "d"], 3);
11. Slasher Flick
截斷數(shù)組
返回一個數(shù)組被截斷n個元素后還剩余的元素,截斷從索引0開始挂谍。
方法一:(slice)
function slasher(arr, howMany) {
return arr.slice(howMany,arr.length);
}
slasher([1, 2, 3], 2);
方法二:(splice)
function slasher(arr, howMany) {
arr.splice(0,howMany);
return arr;
}
slasher([1, 2, 3], 2);
12. Mutations
比較字符串
(蛤蟆可以吃隊友叔壤,也可以吃對手)
如果數(shù)組第一個字符串元素包含了第二個字符串元素的所有字符,函數(shù)返回true口叙。
舉例炼绘,["hello", "Hello"]應該返回true,因為在忽略大小寫的情況下妄田,第二個字符串的所有字符都可以在第一個字符串找到俺亮。
["hello", "hey"]應該返回false,因為字符串"hello"并不包含字符"y"疟呐。
["Alien", "line"]應該返回true脚曾,因為"line"中所有字符都可以在"Alien"找到。
function mutation(arr) {
var FirstVal=arr[0].toLowerCase();
var SecondVal = arr[1].toLowerCase();
for(var i in SecondVal){
if(FirstVal.indexOf(SecondVal[i])==-1){
return false;
}
}
return true;
}
mutation(["hello", "hey"]);
13. Falsy Bouncer
過濾數(shù)組假值
(真假美猴王)
刪除數(shù)組中的所有假值启具。
在JavaScript中本讥,假值有false、null鲁冯、0囤踩、""、undefined 和 NaN晓褪。
function bouncer(arr) {
var newArr = arr.filter(function(e){
if(e){
return e;
}
});
return newArr;
}
bouncer([7, "ate", "", false, 9]);
14. Seek and Destroy
摧毀數(shù)組
實現(xiàn)一個摧毀(destroyer)函數(shù)堵漱,第一個參數(shù)是待摧毀的數(shù)組,其余的參數(shù)是待摧毀的值涣仿。
思路:
摧毀函數(shù)destroyer(arr,argument1,argument2,argument3,...)
函數(shù)參數(shù)不確定勤庐,第一個參數(shù)為一個數(shù)組示惊,其他參數(shù)為要摧毀的數(shù)。即目標輸出的數(shù)組應該是第一個參數(shù)數(shù)組刪除其他參數(shù)后的數(shù)組愉镰。
將從第二個參數(shù)開始的參數(shù)組成一個數(shù)組米罚。然后用fitter()來將數(shù)組內(nèi)的每個數(shù)和新的數(shù)組進行比對,返回不符合的丈探。
function destroyer(arr) {
var arr_arg = arguments;
var newArr=[];
for(var i=1;i<arr_arg.length;i++){
newArr.push(arr_arg[i]);
}
arr = arr.filter(function(val){
return newArr.indexOf(val) == -1;
});
return arr;
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
15. Where do I belong
數(shù)組排序并找出元素索引
先給數(shù)組排序录择,然后找到指定的值在數(shù)組的位置,最后返回位置對應的索引碗降。
舉例:where([1,2,3,4], 1.5) 應該返回 1隘竭。因為1.5插入到數(shù)組[1,2,3,4]后變成[1,1.5,2,3,4],而1.5對應的索引值就是1讼渊。
同理动看,where([20,3,5], 19) 應該返回 2。因為數(shù)組會先排序為 [3,5,20]爪幻,19插入到數(shù)組[3,5,20]后變成[3,5,19,20]菱皆,而19對應的索引值就是2。
function where(arr, num) {
arr.push(num);
arr.sort(function(a,b){
return a-b;
});
var result = arr.indexOf(num);
return result;
}
where([40, 60], 50);
16. Caesars Cipher
凱撒密碼
(讓上帝的歸上帝挨稿,凱撒的歸凱撒)
下面我們來介紹風靡全球的凱撒密碼Caesar cipher仇轻,又叫移位密碼。
移位密碼也就是密碼中的字母會按照指定的數(shù)量來做移位奶甘。
一個常見的案例就是ROT13密碼拯田,字母會移位13個位置川蒙。由'A' ? 'N', 'B' ? 'O'月幌,以此類推麻顶。
寫一個ROT13函數(shù)说墨,實現(xiàn)輸入加密字符串判帮,輸出解密字符串渣触。
所有的字母都是大寫齿诉,不要轉(zhuǎn)化任何非字母形式的字符(例如:空格嗦锐,標點符號)橄霉,遇到這些特殊字符窃爷,跳過它們。
ASCII字符
在JavaScript中可以通過String.prototype.charCodeAt()方法返回0至65535這間的整數(shù)姓蜂,代表索引處理字符的UTF-16編碼單元按厘。可以通過這個方法查出每個字符對應的ASCII編碼:
'a'.charCodeAt(); //97
'A'.charCodeAt(); //65
'abc'.charCodeAt(0); //97
'ABC'.charCodeAt(0); //65
如此一來钱慢,A-Z對應的就是65-90逮京。而ROT13是將大寫字符串將向后移13位,然后轉(zhuǎn)換成對應的字符束莫。那么:
- 小于65和大于90對應的就是小寫字符a-z
- 大于等于65和小于等于77對應的就是大寫字符A-M
- 大于等于78和小于等于90對應的就是大寫字符N-Z
function rot13(str) {
var newStr='';
for(var i in str){
var temp= str.charCodeAt(i);
if(temp<65 || temp>91){
newStr+=str[i];
continue;
}
if(temp>77){
newStr+=String.fromCharCode(temp-13);
}else{
newStr+=String.fromCharCode(temp+13);
}
}
return newStr;
}
rot13("SERR CVMMN!")