溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現Pig Latin

發布時間:2021-10-18 14:05:45 來源:億速云 閱讀:203 作者:iii 欄目:web開發

這篇文章主要講解了“如何實現Pig Latin”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何實現Pig Latin”吧!

理解題目

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

Pig Latin is a way of altering English Words. The rules are as follows:  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.  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

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

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

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

分析過程

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

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

a.按索引遍歷

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

2.由淺入深:

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

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

c.嘗試優化

偽代碼

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

VAR STR  VAR vowelLetters = ['a','e','i','o','u'] // 以元音開頭 IF STR[0] in vowelLetters      return STR + 'way' // 在STR中找到元音索引 FOR (S, INDEX) in STR      IF S IN vowelLetters          return STR.slice(INDEX) +  STR.slice(0,INDEX) + 'ay' // 單詞中沒有元音      renturn STR + ay 復制代碼

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

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

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

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

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

另一條路

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

如何實現Pig Latin

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

  1. 用兩個括號,分成兩組

  2. ([^aeiou]*) 表示匹配不是(^)aeiou 的0到多個字符。

  3. (\w*) 剩下字符是一組

完成代碼

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

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

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

感謝各位的閱讀,以上就是“如何實現Pig Latin”的內容了,經過本文的學習后,相信大家對如何實現Pig Latin這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女