FreeCodeCamp初級演算法部分學習

来源:https://www.cnblogs.com/yexiao-windy/archive/2019/02/25/10430101.html
-Advertisement-
Play Games

Reverse a String 翻轉字元串 先把字元串轉化成數組,再藉助數組的reverse方法翻轉數組順序,最後把數組轉化成字元串。 你的結果必須得是一個字元串 當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。 這是一些對你有幫助的資源: Global String Obj ...


 

Reverse a String 

翻轉字元串

先把字元串轉化成數組,再藉助數組的reverse方法翻轉數組順序,最後把數組轉化成字元串。

你的結果必須得是一個字元串

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1  function reverseString(str) {
 2   // 請把你的代碼寫在這裡
 3   var val=[];
 4   val=str.split('');
 5   str=(val.reverse()).join('');
 6   return str;
 7 }
 8 
 9 
10 reverseString("hello");

Factorialize a Number 

計算一個整數的階乘

如果用字母n來代表一個整數,階乘代表著所有小於或等於n的整數的乘積。

階乘通常簡寫成 n!

例如: 5! = 1 * 2 * 3 * 4 * 5 = 120

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function factorialize(num) {
 2   // 請把你的代碼寫在這裡
 3   if(num === 0)
 4     return 1;
 5   else if (num == 1)
 6     return num;
 7   else
 8     return num*factorialize(num-1); //這裡採用了遞歸的方法
 9 }
10 
11 
12 factorialize(0);

 

Check for Palindromes 

檢查迴文字元串

如果給定的字元串是迴文,返回true,反之,返回false

如果一個字元串忽略標點符號、大小寫和空格,正著讀和反著讀一模一樣,那麼這個字元串就是palindrome(迴文)。

註意你需要去掉字元串多餘的標點符號和空格,然後把字元串轉化成小寫來驗證此字元串是否為迴文。

函數參數的值可以為"racecar""RaceCar""race CAR"

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function palindrome(str) {
 2   // 請把你的代碼寫在這裡
 3   var val=[];
 4   var str1,str2;
 5   val=str.replace(/[^a-zA-Z0-9]/g,'').toLowerCase().split('');
 6   str1=val.join("");
 7   str2=val.reverse.join('');
 8   if (str1===str2)
 9      return true;
10   else
11     return false;
12 }
13 
14 
15 palindrome("eye");

 

Find the Longest Word in a String 

找出最長單詞

在句子中找出最長的單詞,並返回它的長度。

函數的返回值應該是一個數字。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function findLongestWord(str) {
 2   // 請把你的代碼寫在這裡
 3   var val=str.split(' ');
 4   var j=0;
 5   for(var i=1;i<val.length;i++){
 6     if(val[j].length<val[i].length)
 7       j=i;
 8   }
 9   
10   return val[j].length;
11 }
12 
13 
14 findLongestWord("The quick brown fox jumped over the lazy dog");

 

Title Case a Sentence 

句中單詞首字母大寫

確保字元串的每個單詞首字母都大寫,其餘部分小寫。

像'the'和'of'這樣的連接符同理。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function titleCase(str) {
 2   // 請把你的代碼寫在這裡
 3   var val=str.toLowerCase().split(' ');
 4   for(var i=0;i<val.length;i++){
 5       var val2=val[i].split('');  //不要把分開裡面也當成數組,那是字元串
 6       val2[0]=val2[0].toUpperCase();
 7       val[i]=val2.join("");
 8     }
 9     
10   str=val.join(' ');
11   return str;
12 }
13 
14 
15 /* 高人寫法!
16 function titleCase(str) {
17 
18 
19   var newstr=str.toLowerCase().split(" ").map(function(item){
20     //一、toLowerCase()全部轉化為小寫; 
21     //二、split()拆分字元串為數組; 
22     //三、map()方法返回一個新數組;
23     return item[0].toString().toUpperCase()+item.slice(1);
24     //獲取數組的第一個字母,轉化為大寫
25     //然後加上後面的小寫內容(slice()方法獲取範圍內容,1表示從第二個字母開始)
26   }).join(" ");
27    //join()方法組合成字元串
28   return newstr;
29 }
30 */
31 
32 
33 titleCase("I'm a little tea pot")

Return Largest Numbers in Arrays 

找出多個數組中的最大數

右邊大數組中包含了4個小數組,分別找到每個小數組中的最大值,然後把它們串聯起來,形成一個新數組。

提示:你可以用for迴圈來迭代數組,並通過arr[i]的方式來訪問數組的每個元素。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function largestOfFour(arr) {
 2   // 請把你的代碼寫在這裡
 3   var temp=[];
 4   for(var i=0;i<arr.length;i++){
 5     var val=arr[i][0];
 6     for(var j=1;j<arr[i].length;j++){
 7       if(val<arr[i][j]) val=arr[i][j]
 8     }
 9     temp.push(val)
10   }
11   return temp;
12 }
13 
14 
15 largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);

 

Confirm the Ending 

檢查字元串結尾

判斷一個字元串(str)是否以指定的字元串(target)結尾。

如果是,返回true;如果不是,返回false。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function confirmEnding(str, target) {
 2   // 請把你的代碼寫在這裡
 3   str=str.split(' ').join('').substr(-target.length);
 4   if(str==target)
 5     return true;
 6   else
 7     return false;
 8 }
 9 
10 
11 confirmEnding("Bastian", "n");

 

str.substr(start[, length])
參數:
start
開始提取字元的位置,如果為負值,則從字元串的尾部開始算起的位置。
length
可選,提取的字元數,如果省略了該參數,那麼返回從開始位置到結尾的字元串。

Repeat a string repeat a string 

重覆輸出字元串

(重要的事情說3遍)

重覆一個指定的字元串 num次,如果num是一個負數則返回一個空字元串。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function repeat(str, num) {
 2   // 請把你的代碼寫在這裡
 3   var k='';
 4   if(num<0) return "";
 5   else{
 6     for(var i=0;i<num;i++)
 7       k+=str;
 8     return k;}
 9 }
10 
11 
12 repeat("abc", 3);

 

Truncate a string 

截斷字元串

(用瑞茲來截斷對面的退路)

如果字元串的長度比指定的參數num長,則把多餘的部分用...來表示。

切記,插入到字元串尾部的三個點號也會計入字元串的長度。

但是,如果指定的參數num小於或等於3,則添加的三個點號不會計入字元串的長度。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function truncate(str, num) {
 2   // 請把你的代碼寫在這裡
 3    var str1="";
 4   if(num<=3)
 5     str1=str.slice(0,num)+"...";
 6   else if(num>=str.length){
 7     str1=str;
 8   }else{
 9     str1=str.slice(0,num-3)+"...";
10   }
11   return str1;
12 }
13 
14 
15 truncate("A-tisket a-tasket A green and yellow basket", 11);

 

Chunky Monkey 

猴子吃香蕉, 分割數組

(猴子吃香蕉可是掰成好幾段來吃哦)

把一個數組arr按照指定的數組大小size分割成若幹個數組塊。

例如:chunk([1,2,3,4],2)=[[1,2],[3,4]];

chunk([1,2,3,4,5],2)=[[1,2],[3,4],[5]];

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function chunk(arr, size) {
 2   // 請把你的代碼寫在這裡
 3   var arr1=[];
 4   var start=0,end=size;
 5   for(var i=0;i<size+1;i++){ //多一次迴圈,處理分割兩次得3塊的情況
 6     if(start>=arr.length)
 7       break;  //已經分配結束
 8     else if(end>=arr.length)
 9       arr1.push(arr.slice(start)); //最後一次不夠數或剛好夠數
10     else {arr1.push(arr.slice(start,end));}
11     start+=size;
12     end+=size;
13   }
14   return arr1;
15 }
16 
17 
18 chunk([0, 1, 2, 3, 4, 5], 2);

 

Slasher Flick

截斷數組

返回一個數組被截斷n個元素後還剩餘的元素,截斷從索引0開始。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function slasher(arr, howMany) {
 2   // 請把你的代碼寫在這裡
 3   var val=[];
 4   if(howMany>=arr.length)
 5     return val;
 6   else 
 7     //return arr.slice(howMany); //解法一
 8     return arr.splice(howMany);  //解法二
 9     
10 }
11 
12 
13 slasher([1, 2, 3], 2);

 

解法一:

思路:首先準確理解slice()的用法,slice不會改變原數組,會生成一個新數組,slice(begin,end),這裡howMany是begin,end被省略,則會一直提取到原數組末尾。

解法二:

思路:詳細理解splice()的用法,splice會直接對數組進行修改,返回的是由被刪除元素組成的一個數組,則原數組中就沒有了被刪除的元素。

Mutations

比較字元串

(蛤蟆可以吃隊友,也可以吃對手)

如果數組第一個字元串元素包含了第二個字元串元素的所有字元,函數返回true。

舉例,["hello", "Hello"]應該返回true,因為在忽略大小寫的情況下,第二個字元串的所有字元都可以在第一個字元串找到。

["hello", "hey"]應該返回false,因為字元串"hello"並不包含字元"y"。

["Alien", "line"]應該返回true,因為"line"中所有字元都可以在"Alien"找到。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function mutation(arr) {
 2   // 請把你的代碼寫在這裡
 3   arr[0]=arr[0].toLowerCase();          //將所有字元串轉換為小寫
 4   arr[1]=arr[1].toLowerCase();
 5   for(var i=0; i<arr[1].length; i++)   //對要查的子鏈進行遍歷
 6     //檢測第二個字元串中的字元在第一個數組中是否存在
 7     if(arr[0].indexOf(arr[1][i])==-1){
 8       return false;
 9     }
10   return true;                          //迴圈未輸出false即輸出true
11 }
12 mutation(["hello", "hey"]);

 

Falsy Bouncer

過濾數組假值

(真假美猴王)

刪除數組中的所有假值。

在JavaScript中,假值有falsenull0""undefinedNaN

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function bouncer(arr) {
 2   // 請把你的代碼寫在這裡
 3  return arr.filter(function(s){
 4    return Boolean(s);
 5  });
 6 //解法二: return arr.filter(Boolean);
 7 }
 8 
 9 
10 bouncer([7, "ate", "", false, 9]);

 

 

思路:用  Boolean() 函數進行類型轉換。如果它的參數是 0、-0、null、undefined、false、NaN、"",生成的Boolean對象的值會為false,也就是“假值”。

var new_array = arr.filter(callback(element[, index[, array]])[, thisArg])
filter 為數組中的每個元素調用一次 callback 函數,並利用所有使得 callback 返回 true 或 等價於 true 的值 的元素創建一個新數組。callback 只會在已經賦值的索引上被調用,對於那些已經被刪除或者從未被賦值的索引不會被調用。那些沒有通過 callback 測試的元素會被跳過,不會被包含在新數組中。

 

 JavaScript中,Truthy(真值)指的是在)布爾值上下文中轉換後的值為真的值.所有值都是真值,除非它們被定義為falsy(即除了)false0""nullundefined 和 NaN外)。
JavaScript在布爾值上下文中使用強制類型轉換(coercion)。
JavaScript中的真值示例如下(將被轉換為trueif後的代碼段將被執行):
if(true) if({}) if([]) if(42) if("foo") if(new Date())
if(-42) if(3.14) if(-3.14) if(Infinity) if(-Infinity)

Seek and Destroy

摧毀數組

金克斯的迫擊炮!

實現一個摧毀(destroyer)函數,第一個參數是待摧毀的數組,其餘的參數是待摧毀的值。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 

 1 function destroyer(arr) {
 2   // 請把你的代碼寫在這裡
 3       var argumentsArr = [];//創立摧毀值數組
 4       for(var i=0;i<arguments.length-1;i++){
 5           argumentsArr.push(arguments[i+1]);
 6           }
 7       arr = arr.filter(function(element){
 8           //遍歷arr所有值,判斷是否在摧毀值數組中,無則返回-1,為true,返回通過的元素
 9             return argumentsArr.indexOf(element) == -1;
10           });
11       return arr;
12 destroyer([1, 2, 3, 1, 2, 3], 2, 3);

 

簡單總結filter方法:

1,遍曆數組中的元素

2,函數測試,檢查return是否等於true;

3,返回一個包含所有通過測試的元素的新數組。

 

arr.filter方法本身自帶迴圈,它自己會使用我們給定的函數來測試數組中的所有元素,並創建(即返回)一個包含所有通過測試的元素的新數組(註意它並沒有改變原數組)。不能嵌套入for迴圈中!

 

錯誤寫法:

1 for(i=0;i<argumentsArr.length;i++ ){    arr.filter(function(argumentsArr[i]){
2                    return arr.indexOf(argumentsArr[i]) == -1;});
3 }

 

Where do I belong

數組排序並找出元素索引

我身在何處?

先給數組排序,然後找到指定的值在數組的位置,最後返回位置對應的索引。

舉例:where([1,2,3,4], 1.5) 應該返回 1。因為1.5插入到數組[1,2,3,4]後變成[1,1.5,2,3,4],而1.5對應的索引值就是1

同理,where([20,3,5], 19) 應該返回 2。因為數組會先排序為 [3,5,20]19插入到數組[3,5,20]後變成[3,5,19,20],而19對應的索引值就是2

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

這是一些對你有幫助的資源:

 1 function where(arr, num) {
 2   // 請把你的代碼寫在這裡
 3   arr.push(num);
 4   arr.sort(function(a,b){
 5     return a-b;
 6   });//升序排列
 7   return arr.indexOf(num);
 8 }
 9 
10 
11 where([40, 60], 50);

 

如果指明瞭 compareFunction ,那麼數組會按照調用該函數的返回值排序。即 a 和 b 是兩個將要被比較的元素:
1、如果 compareFunction(a, b) 小於 0 ,那麼 a 會被排列到 b 之前;
2、如果 compareFunction(a, b) 等於 0 , a 和 b 的相對位置不變。備註: ECMAScript 標準並不保證這一行為,而且也不是所有瀏覽器都會遵守(例如 Mozilla 在 2003 年之前的版本);
3、如果 compareFunction(a, b) 大於 0 , b 會被排列到 a 之前。
compareFunction(a, b) 必須總是對相同的輸入返回相同的比較結果,否則排序的結果將是不確定的。

規則

排序

   

a>b

a<b

return > 0

b、a

升序

a-b>0

a-b<0

return < 0

a、b

降序

b-a<0

b-a>0

簡化一下(剛好相反):

  • a-b輸出從小到大排序
  • b-a輸出從大到小排序

Caesars Cipher

凱撒密碼

(讓上帝的歸上帝,凱撒的歸凱撒)

下麵我們來介紹風靡全球的凱撒密碼Caesar cipher,又叫移位密碼。

移位密碼也就是密碼中的字母會按照指定的數量來做移位。

一個常見的案例就是ROT13密碼,字母會移位13個位置。由'A' ↔ 'N', 'B' ↔ 'O',以此類推。

寫一個ROT13函數,實現輸入加密字元串,輸出解密字元串。

所有的字母都是大寫,不要轉化任何非字母形式的字元(例如:空格,標點符號),遇到這些特殊字元,跳過它們。

當你完成不了挑戰的時候,記得開大招'Read-Search-Ask'。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • var MyModules = (function Manager(){ // 保存方法 var modules = {}; // 傳方法名,參數,方法 方法的參數由deps提供 function define(name, deps, impl) { // 將模塊中的方法給deps 作為下一個函數的... ...
  • 使用vscode開發vue項目的時候,從遠端拉下一個新的項目後,安裝完依賴後跑起項目時,發現直接報了一堆語法錯誤:包括換行、空格、單雙引號、分號等各種格式問題 ...
  • 葵花寶典: 【1】相鄰的2個margin值會疊加在一起。 【2】子元素設定的margin值會影響父元素。 在標準瀏覽器下(FireFox,Chrome,Opera,Safari)會有問題。IE下一般表現良好。 原因是:一個盒子如果沒有上補白(padding-top)和上邊框(border-top)那 ...
  • 主頁劃 5 個組件,即 header icon swiper recommend weekend 一. header區域開發 1. 安裝 stylus npm install stylus --save cnpm install stylus-loader --save 2. 編寫樣式 3. 添加i ...
  • 本文由雲+社區發表 作者:廖彩明 在從事前端開發過程中,瀏覽器作為最重要的開發環境,瀏覽器基礎是是前端開發人員必須掌握的基礎知識點,它貫穿著前端的整個網路體系。對瀏覽器原理的瞭解,決定著編寫前端代碼性能的上限。瀏覽器作為JS的運行環境,學習總結下現代瀏覽器的相關知識 前言 經常聽說瀏覽器內核,瀏覽器 ...
  • 對於如此多的不同情形,可以總結如下:- 在不賦值的情形下,在小括弧中的函數或者函數表達式,被阻止聲明為一個全局的變數,同時其內部是可執行的 ...
  • 繼上篇 "文章" 介紹了Webpack的基本概念,完整流程,以及打包過程中廣播的一些事件的作用,這篇文章主要講生成的chunk文件如何輸出成具體的文件。分同步和非同步兩種情況來分析輸出的文件 。 模塊文件show.js 同步載入 生成的bundle文件 非同步載入 經webpack打包會生成兩個文件0. ...
  • 錯誤消息如圖: 如果你看到此錯誤消息,則說明 v-for 指令的 key值 重覆了,只需修改你的 key值 讓其不會重覆即可。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...