成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一道算法小題的分析過程

開發 前端 算法
最近在看算法的問題比較多,希望能以一道小題,來記錄算法分析的過程。題目是: Pig Latin

[[384555]]

 理解題目

最近在看算法的問題比較多,希望能以一道小題,來記錄算法分析的過程。題目是: Pig Latin

  1. Pig Latin is a way of altering English Words. The rules are as follows: 
  2.  
  3. If a word begins with a consonant, take the first consonant or consonant cluster, move it to the end of the word, and add “ay” to it. 
  4.  
  5. If a word begins with a vowel, just add “way” at the end

 遇到這種描述比較少的題,第一反應是題目描述越簡單,隱藏條件就會多。不慌先看維基百科 對于 Pig Latin 的解釋: 豬拉丁 。我喜歡在看題目的時候,先看看維基百科,會了解下題目的背景和淵源,讓自己更好的理解題目的同時,讓解題也有些趣味性。簡單解析下規則:當一個單詞以輔音字母開頭,將輔音字母移到最后,并添加 ay 比如

  • california → aliforniacay : c 移動到最后然后添加 ay
  • paragraphs → aragraphspay:p 移動到最后然后添加 ay
  • glove → oveglay:gl 移動到最后然后添加 ay ⚠️ 這里是找到第一個元音字母之前的所有輔音字母

元音字母: a、e、i、o、u

當單詞以元音字母開頭的時候直接在單詞后面添加way 比如

  • algorithm → algorithmway : a 是元音字母所以在單詞后添加 way
  • eight → eightway : e 是元音字母所以在單詞后添加 way

題目分析完了,我們還需要通過閱讀測試用例來檢查是否有遺漏,看最后一條:

  1. Should handle words without vowels. translatePigLatin(“rhythm”) should return “rhythmay”. 

這個規則其實滿足第一種情況,當找不到元音的時候,直接在后面加 ay

分析過程

當我們拿到一道算法題目的時候,按照幾個套路來「攻城」

1.算法分類,這道題是字符串題,對于字符串的操作無非有兩種:

a.按索引遍歷

b.replace,replace 中尤其以正則不講武德。

2.由淺入深:

a.就是上來先根據給出的條件,按照暴力的方向去寫偽代碼

b.在根據邏輯找關鍵循環因子 和 優化手段

c.嘗試優化

偽代碼

先寫偽代碼,這部分代碼比較糙,主要用于整理分析過程

  1. VAR STR  
  2. VAR vowelLetters = ['a','e','i','o','u'
  3. // 以元音開頭 
  4. IF STR[0] in vowelLetters  
  5.     return STR + 'way' 
  6. // 在STR中找到元音索引 
  7. FOR (S, INDEXin STR  
  8.     IF S IN vowelLetters  
  9.         return STR.slice(INDEX) +  STR.slice(0,INDEX) + 'ay' 
  10. // 單詞中沒有元音      
  11. renturn STR + ay 
  12. 復制代碼 

分析過程有了我們可以寫JavaScript代碼了

  1. function translatePigLatin(str) { 
  2.     // 先準備需要的元音數組 
  3.     const vowelLetters = ['a','e','i','o','u'
  4.     // 特殊情況:如果以元音開頭 
  5.     if(vowelLetters.includes(str[0])) return `${str}way`     
  6.      
  7.     // 正常情況 
  8.     for (let i = 0; i < str.length; i++) { 
  9.         if(vowelLetters.includes(str[i])) { 
  10.             return `${str.slice(i)}${str.slice(0, i)}ay` 
  11.         } 
  12.     } 
  13.  
  14.     // 如果前面攔不住 說明沒有元音 
  15.     return `${str}ay` 
  16.  
  17. translatePigLatin("consonant"); 
  18. 復制代碼 

Review 上面👆代碼,已經可以通過測試了,那么分析如何優化 。從代碼中分析到整個核心的邏輯就落在 ${str.slice(i)}${str.slice(0, i)}ay 那么關鍵點在于找到 第一個元音的索引那么我們改代碼

  1. function translatePigLatin(str) { 
  2.     // 直接找索引 
  3.     let index = str.split('').findIndex(s => /[aeiou]/.test(s)) 
  4.  
  5.     if(index < 0)return `${str}ay` 
  6.     if (index === 0)return `${str}way` 
  7.     return `${str.slice(index)}${str.slice(0, index)}ay` 
  8.  
  9. translatePigLatin("consonant"); 
  10. 復制代碼 

代碼簡化一些,邏輯更清晰了

另一條路

從分析過程的路上來看,已經用循環遍歷的方法完成了,那么另一條路(replace)應該如何實現?第一種方法的結果來看,需要用到正則分組的方法來調換位置。思路是分兩組第一組是開頭到元音,第二組是元音到結尾。然后將這兩組順序調換后,添加后綴。在開發和調試正則的時候,推薦 regex101.com/ 來調試正則表達式


通過調試器來完成這個正則:/([^aeiou]*)(\w*)/ 解釋下

  1. 用兩個括號,分成兩組
  2. ([^aeiou]*) 表示匹配不是(^)aeiou 的0到多個字符。
  3. (\w*) 剩下字符是一組

完成代碼

  1. function translatePigLatin(str) { 
  2.     return str.replace(/([^aeiou]*)(\w*)/, '$2$1ay'
  3.  
  4. translatePigLatin("consonant"); 
  5. 復制代碼 

通過測試,👆上面的代碼已經,除了元音在開頭的情況沒有覆蓋,其他兩種情況是包含的。元音在開頭的時候,需要加的后綴為way, 也就是當 ([^aeiou]*) 匹配的不到的 $1 為空的時,后綴變成 ay 順著這個思路完善,JavaScript 字符串 replace 方法第二個參數是支持函數的 String.prototype.replace() - JavaScript | MDN

  1. function translatePigLatin(str) { 
  2.     return str.replace(/([^aeiou]*)(\w*)/, (_, p1, p2) => `${p2}${p1||'w'}ay`) 
  3.  
  4. translatePigLatin("consonant"); 
  5. 復制代碼 

總結

總結下 當拿到一道算法題的基本套路是

  1. 分類,是那一類的題,分完類后基本上能確定方向,比如樹的題大部分都要用到遞歸,如果你想刻意訓練遞歸,可以在樹分組下訓練。
  2. 先分析題目邏輯,先用簡單粗暴的方法把邏輯的偽代碼寫出來,然后再突破優化。
  3. Review 其他方向上是否有更優解。

最后給個小建議:如果你是短期想突破面試,刷leetcode。同時推薦:https://www.codewars.com/,相比之下codewars 更注重當前編程語言的實操,而不是以最優算法為目的,里邊有很多「意外驚喜」。會被很多「奇技淫巧|黑暗魔法」所折服。據坊間流傳 codewars 的難度上限更高。

 

責任編輯:姜華 來源: 前端思維框架
相關推薦

2009-08-11 10:12:07

C#算法

2009-08-11 14:59:57

一道面試題C#算法

2024-03-18 13:32:11

2009-08-11 15:09:44

一道面試題C#算法

2009-06-22 13:43:00

java算法

2011-08-18 09:33:23

2024-10-11 17:09:27

2014-04-29 14:58:24

筆試題微軟筆試題

2021-04-29 21:06:49

有序數組算法

2018-03-14 07:42:48

2011-05-23 11:27:32

面試題面試java

2018-03-06 15:30:47

Java面試題

2022-04-08 14:50:37

存儲零信任安全

2017-06-26 08:08:25

2020-08-07 11:23:31

網絡安全人工智能數據

2019-09-02 15:06:16

面試字節跳動算法

2022-01-19 11:39:15

數據治理大數據數據

2009-12-16 09:58:35

Chrome OS

2013-06-03 10:18:42

Ubuntu

2011-03-07 13:29:52

NeusoftJava API
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩aⅴ视频 | av网址在线播放 | 国产精品永久免费 | 激情av网站 | 天天干天天插天天 | 久久精品美女 | 久久精品二区 | 成人在线免费视频 | 久久精品播放 | 亚洲精品一区二区 | 中文字幕亚洲一区二区三区 | 日韩免费av| 久久久精 | 欧美视频中文字幕 | 亚洲第一中文字幕 | 成人在线视频免费观看 | 国产99久久精品一区二区永久免费 | 夜夜爽99久久国产综合精品女不卡 | 视频一区在线 | 日韩一区二区av | 欧美精品一区三区 | 国产成人精品免费视频大全最热 | 国产最新视频在线 | 欧美精品一区免费 | 欧美一区二区三区四区视频 | 欧美日韩一区不卡 | 中文欧美日韩 | 成人三级网址 | 成人伊人网 | 在线观看国产视频 | 91xh98hx 在线 国产 | 中文字幕精品一区二区三区精品 | 91影院在线观看 | 久久丁香| 欧美专区在线 | 亚洲精品视频一区 | 日韩欧美一区二区三区四区 | 在线观看中文字幕 | 欧美一区二区三 | 超碰97免费| 在线观看欧美一区 |