首頁  >  文章  >  web前端  >  javascript基礎練習之翻轉字串與回文

javascript基礎練習之翻轉字串與回文

高洛峰
高洛峰原創
2017-02-21 14:22:241294瀏覽

最近在學習的時候到了基礎演算法這一章節,讓我對js內建物件方法的掌握還有思維邏輯都得到了提升,所藉此機會來寫一寫學習心得和總結。以下這篇文章主要介紹了利用javascript實現翻轉字串與回文的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

翻轉字串

翻轉字串(Reverse a String),就是把字串倒序處理的意思,例如給定一個字串”hello”,翻轉後應該返回”olleh”。

測試案例

  1. #reverseString("hello") 應該會回傳「olleh」

  2. reverseString("Greetings from Earth") 應該回傳「htraE morf sgniteerG」

實作想法

這裡說最方便的方法就是將字串轉成數組,再顛倒數組並轉成字串返回。需要用到字串物件和陣列物件的內建方法:

  1. String.split()

  2. Array.reverse()

  3. Array.join()

具體可以去看JavaScript參考手冊

function reverseString(str) {
 return str.split('').reverse().join('');
}

reverseString("hello");

一句return搞定,很簡單有木頭? !

在此基礎上來看看回文是怎麼玩的⬇️

#回文

「Madam ,I'mAdam.」 這是亞當在伊甸園裡碰上夏娃說的第一句話,這句話正著讀和反著讀一模一樣,這樣的句子就是回文,英文裡叫Palindrome。

舉個栗子——“上海自來水來自海上”,這句話順著讀和反著讀都是相同的,還有很多英語單字也是:Level、Madam、Radar、LOL(哈哈哈)…

測試案例

  1. #palindrome("Race Car") 應該傳回true

  2. #palindrome("not a palindrome") 應該回傳false

  3. palindrome("0_0 (: /-\ :) 0-0") 應該回傳true

實作想法

我們需要寫一個叫palindrome()的方法,傳入一個叫str的參數,如果str是一個Palindromes會回傳true,反之為false。

要注意將標點符號和空格去掉並toUpperCase or toLowerCase後再判斷。

需要用到以下知識點:

  • 正則表達式(regular expression) ,用來過濾符號和空格

  • #String.replace() 取代與正規表示式相符的子字串

  • String.toLowerCase() 把字串轉換為小寫

關於正規表示式

這裡要求符合大小寫英文字母和整數,任何標點符合和空格將會被過濾掉。所以可以使用/[^A-Za-z0–9]/g 或/[\W_]/g

  • #[^A-Z] 來匹配非26個大寫字母中的任一個

  • [^a-z] 符合非26個小寫字母中的任一

  • [^0-9] 符合非0到9中的任一數字

  • [^_] 符合非底線

  • ^ 符合字串的開始

  • \w 注意是小寫,匹配字母或數字或底線或漢字

  • \W 注意是大寫,匹配任意不是字母、數字、底線、漢字的字符,等價於[^A-Za-z0-9_]

  • g 表示全域搜尋

這是我的方法:

function palindrome(str) {
 str = str.replace(/[\W_]/g,'').toLowerCase();
 var reverseStr = str.split('').reverse().join('');
 return str===reverseStr;
}

palindrome("eye");

我在網路上看到還可以用For循環來實作:

function palindrome (str) {
 var reg = /[\W_]/g,
 regStr = str.toLowerCase().replace(reg, ''),
 len = regStr.length;

 for (var i = 0, halfLen = len / 2; i < halfLen; i++){
 if (regStr[i] !== regStr[len - 1 - i]) {
  return false;
 }
 }
 return true;
}

這個想法很巧妙的運用了回文的特點,把整個字串切成一半,循環遍歷並依序判斷首尾字元是否相等。

還有一個運用了遞迴的實作:

#
function palindrome (str) {
 // 删除字符串中不必要的字符
 var re = /[\W_]/g;
 // 将字符串变成小写字符
 var lowRegStr = str.toLowerCase().replace(re, &#39;&#39;);
 // 如果字符串lowRegStr的length长度为0时,字符串即是palindrome
 if (lowRegStr.length === 0) {
 return true;
 }

 // 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome
 if (lowRegStr[0] !== lowRegStr[lowRegStr.length - 1]) {
 return false;
 } else {
 return palindrome(lowRegStr.slice(1, lowRegStr.length - 1));
 }
}

感覺另外兩個實作思維比我屌多了,自己在程式設計的路上才走沒多遠,一步一步來吧。

對了,別糾結翻轉字串和回文的差別了!翻轉字串只是將倒序後的字串回傳;而回文面對的則是更長更複雜的句子,需要將過濾掉空格和標點符號的句子和倒序後的句子比較是否相等。

更多javascript基礎練習之翻轉字串與回文相關文章請關注PHP中文網!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn